这道题,题意很简单,就是要让3个串形成满足有一个koutsu或者shuntsu,所需要添加的串的最少个数;根据条件可以知道,要满足至少有一个,那么就需要:
1.这三个字符串完全相同;
2.这三个字符串的suit(也就是后面的字母)必须相同,并且三个成连续的数字;
那么要我就可以讨论了;
1.如果三个相同或者suit相同时数字连续就直接不需要添加就够了(cout<<0);
2.如果有两个串完全相同就只需要添加一个;
3.如果如果三个的suit相同,那么就判断是不是有1,3,4或者1,3,5这些隔开,只需要添加一个就保证连续的情况;
4.如果有两个的suit相同,判断是不是1,3这种和,1,2这种,只需要添加一个‘
5.其他的就是三个串完全不同(指的每个串的suit都不同),那么就需要添加2个了;
所以情况就这么多,直接模拟即可(这里还考差了字符串读入的问题其实用一个stringstream getline就OK了):
AC代码:
#include<iostream>
#include<string>
#include<sstream>
#include<algorithm>
using namespace std;
string s[4];
bool cmp(string s,string s2){
return s[0]<s2[0];
}
int main(){
string st;
getline(cin,st);
stringstream ss(st);
for(int i=0;ss>>s[i];i++);
if(s[0]==s[1]&&s[1]==s[2])return cout<<0<<endl,0;//如果三个完全相同
if(s[0]==s[1]||s[0]==s[2]||s[1]==s[2])return cout<<1<<endl,0;//如果有两个完全相同
if(s[0][1]==s[1][1]&&s[1][1]==s[2][1]){//如果有三个个suit相同
sort(s,s+3,cmp);//排序
if((s[1][0]==s[0][0]+1&&s[1][0]==s[2][0]-1)) {//判断是不是有连续的1,2,3这种挨着的
return cout<<0<<endl,0;
}else if(s[1][0]==s[0][0]+1||s[1][0]==s[0][0]+2||s[2][0]==s[1][0]+1||s[2][0]==s[1][0]+2){//判断是不是有两个是连续的
return cout<<1<<endl,0;
}else return cout<<2<<endl,0;//如果没有连续的就是2了
}
if(s[0][1]==s[1][1]){//判断两个suit相同的
if(s[1][0]==s[0][0]+1||s[1][0]==s[0][0]+2||s[1][0]==s[0][0]-1||s[1][0]==s[0][0]-2)
{
return cout<<1<<endl,0;
}else return cout<<2<<endl,0;
}else if(s[0][1]==s[2][1]){
if(s[0][0]==s[2][0]+1||s[0][0]==s[2][0]+2||s[0][0]==s[2][0]-1||s[0][0]==s[2][0]-2)
{
return cout<<1<<endl,0;
}else return cout<<2<<endl,0;
}else if(s[1][1]==s[2][1]){
if(s[1][0]==s[2][0]+1||s[1][0]==s[2][0]+2||s[1][0]==s[2][0]-1||s[1][0]==s[2][0]-2)
{
return cout<<1<<endl,0;
}else return cout<<2<<endl,0;
}
cout<<2<<endl;//最后三个完全不同的
return 0;
}