我总感觉这道题过了的代码有问题,我自己出了一个样例
如果定缺牌是S的话,有一次查询:
1T1T3T3T3T4T5T6T7T7T7T8T8T8T
按照下面的代码来算的话(下面的代码A了),结果是“No”。
但是这次询问完全可以算是“Yes”的啊,
一对:1T1T
四个坎牌:
3T3T3T
7T7T7T
8T8T8T
4T5T6T
所以说这道题还有待商榷,如果有大佬能帮我解惑请在下方留言,十分感谢
#include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <vector> #include <stack> #include <sstream> #include <map> #include <set> #include <queue> #include <stdlib.h> typedef long long ll; using namespace std; int main() { int n; while(cin >> n) //询问多少次 { char que; cin>>que; //定缺牌 while(n--) //一共n次询问 { string x; cin >> x; //记录的是每次询问的28个字符(14张牌) int t[10]={0}; int s[10]={0}; int w[10]={0}; int ht,hs,hw; ht=hs=hw=0; //分别表示有没有出现定缺牌 /* ASCLL码的知识点:0-9的ASCLL码是48~57,a-z的ASCLL码是97~122,A-Z的ASCLL码是65~90 */ for(int j=0;j<28;j+=2) //一共14张牌,每张牌占据两个字符,偶数位是数字,奇数位是字符 { if(x[j+1]=='T') { t[x[j]-'0']++; ht=1; //表示T出现过 } if(x[j+1]=='S') { s[x[j]-'0']++; hs=1; //表示S出现过 } if(x[j+1]=='W') { w[x[j]-'0']++; hw=1; //表示W出现过 } } if((que=='S'&&hs==1)||(que=='T'&&ht==1)||(que=='W'&&hw==1)) //如果出现定缺牌,直接输出No { cout << "No" << endl; } else { int kz=0,dj=0; //kz记录的是坎牌(三张连续的同种牌,或者是三张一样的牌,先进行判断连续的牌,再进行判断三张一样的牌) for(int j=1;j<=7;j++) //每种牌一共有九种数字,相邻的三个进行判断,所以只需要判断七次就可以了 { while(t[j] && t[j+1] && t[j+2] ) //先将所有可能是三张连续的同种牌记做坎牌 { kz++; t[j]--; t[j+1]--; t[j+2]--; } while(s[j] && s[j+1] && s[j+2]) { kz++; s[j]--; s[j+1]--; s[j+2]--; } while(w[j] && w[j+1] && w[j+2] ) { kz++; w[j]--; w[j+1]--; w[j+2]--; } } for(int j=1;j<=9;j++) //每种牌,如果是二的倍数,那么对子++,如果是三的倍数,那么是坎牌++ { if(t[j]%2==0) {dj+=t[j]/2;t[j]=0;} if(t[j]%3==0) {kz+=t[j]/3;t[j]=0;} if(s[j]%2==0) {dj+=s[j]/2;s[j]=0;} if(s[j]%3==0) {kz+=s[j]/3;s[j]=0;} if(w[j]%2==0) {dj+=w[j]/2;w[j]=0;} if(w[j]%3==0) {kz+=w[j]/3;w[j]=0;} } if(dj==7||(kz==4&&dj==1)) cout<<"Yes"<<endl; else cout<<"No"<<endl; } } } return 0; }