题目网址:
这道题目是个模拟题,题目比较长,特别是哪是牌底哪是牌顶,分割的时候谁做S1谁做S2要分清楚。
唯一用到的就是判重,我是用STL里面的set去判重,只用到insert()和count()两个成员函数就ok。
其实不太懂这道题目的数据规模,牌堆高度给的最高是100,相互洗牌产生的牌堆按说应该特别多种才对,因为我见题目上没有给牌的颜色加限制,如果每张牌颜色都不同,恐怕组合数会特别多。但是这道题目应该没有给那么变态的数据,直接模拟就给过了。
#include#include #include #include #include using namespace std;const int maxn = 110*2;int main(){ int N; cin >> N; int kase = 0; char buf[maxn]; while(N--) { cout << ++kase << " "; string S1, S2, R, A; int C, ans = 0; cin >> C >> S1 >> S2 >> R; set Set; for(;;) { for(int i = 0; i < 2*C; i++) { if(i % 2) buf[i] = S1[i/2]; else buf[i] = S2[i/2]; } buf[2*C] = '\0'; A = (string)buf; ans++; if(A == R) { cout << ans << endl; break; } if(Set.count(A)) { cout << -1 << endl; break; } Set.insert(A); S1.clear(); for(int i = 0; i < C; i++) S1.push_back(A[i]); S2.clear(); for(int i = C; i < 2*C; i++) S2.push_back(A[i]); } } return 0;}
还有一个字符数组强转string类的用法,处理字符串的时候挺好用的。毕竟要用到set判重,构建set<string>是肯定的。