題目網址: POJ -- 3087ios
這道題目是個模擬題,題目比較長,特別是哪是牌底哪是牌頂,分割的時候誰作S1誰作S2要分清楚。數組
惟一用到的就是判重,我是用STL裏面的set去判重,只用到insert()和count()兩個成員函數就ok。函數
其實不太懂這道題目的數據規模,牌堆高度給的最高是100,相互洗牌產生的牌堆按說應該特別多種纔對,由於我見題目上沒有給牌的顏色加限制,若是每張牌顏色都不一樣,恐怕組合數會特別多。可是這道題目應該沒有給那麼變態的數據,直接模擬就給過了。spa
#include <cstdio> #include <cstring> #include <set> #include <string> #include <iostream> 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<string> 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>是確定的。code