题目大意
\(3\) 块麻将,求需要换掉几张牌才能一次出完 \(3\) 块麻将。
每块麻将,用一个长度为 \(2\) 的字符串给出,字符串由 \((1,9)\) 的一位数字和 \(m\)、\(s\) 或 \(p\) 组成。
\(3\) 块一模一样的麻将或第 \(2\) 位相同,前面是连号的 \(3\) 块麻将都可以一次性出完。
思路分析
分类讨论所有情况。
首先,为了方便讨论,可以先将 \(3\) 块麻将排一下序。先将同花色放一起,再按数字大小从小到大排序。
如果字符串都完全相同或满足同花色且连号,则不用换牌,输出 0
。
接着讨论那两块麻将可以放在一起,那么换那块不在一起的麻将,输出 1
,详见代码。
我们可以认为,最多只需要换两块与其中一块麻将一样的麻将便可出完,所以最多只有可能换 \(2\) 次。所以,如果不满足以上两种情况,则输出 2
。
代码:
/*Written by smx*/
#include<bits/stdc++.h>
using namespace std;
string a[3];
bool cmp(string a,string b)
{
if(a[1]!=b[1])
{
return a[1]<b[1];
}
else
{
return a[0]<b[0];
}
}
int main()
{
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>a[0]>>a[1]>>a[2];
sort(a,a+3,cmp);
if(a[0]==a[1]&&a[1]==a[2]||a[0][1]==a[1][1]&&a[1][1]==a[2][1]&&a[0][0]+1==a[1][0]&&a[1][0]+1==a[2][0])
{
cout<<"0";
}
else if(a[0][1]==a[1][1]&&a[0][0]+1==a[1][0]||a[1][1]==a[2][1]&&a[1][0]+1==a[2][0])//任意两块连号,换掉不是连号的那块
{
cout<<"1";
}
else if(a[0][1]==a[1][1]&&a[0][0]+2==a[1][0]||a[1][1]==a[2][1]&&a[1][0]+2==a[2][0])//任意两块的号相差 1,换一块两个号中间的号
{
cout<<"1";
}
else if(a[0]==a[1]||a[1]==a[2])//任意两块相同,换一块和它们相同的
{
cout<<"1";
}
else//最劣情况,否则输出 2
{
cout<<"2";
}
return 0;
}
标签:string,题解,麻将,&&,字符串,CF1191B
From: https://www.cnblogs.com/shimingxin1007/p/17913493.html