洗牌Shuffle'm Up POJ-3087 模拟
题目链接:Shuffle'm Up
题目大意
模拟纸牌的洗牌过程,已知两个牌数相等的牌堆。求解经过多少次洗牌的过程,使牌的顺序与目标顺序相同。
思路
直接模拟,主要是字符串的操作。问题是,如何判断出不可能的情况。这个题好像除了找是否会出现无限循环以外找不到更好的判断方法了。
如果是用字符数组来写的话,要注意末尾'\0'要有,并且strcmp返回0是说明字符数组相等。
题解
1 #include <iostream> 2 #include <cstring> 3 #include <map> 4 using namespace std; 5 6 string s1, s2; 7 string t, tmp, _tmp; 8 9 10 long long n, ans, length; 11 12 int shuffle() 13 { 14 map<string, int> vis; 15 long long flag = 0; 16 while(1) 17 { 18 //cout << tmp << endl; 19 tmp = ""; 20 flag++; 21 for(int i = 0; i < length; i++) 22 { 23 tmp += s2[i]; 24 tmp += s1[i]; 25 } 26 if(tmp == t) 27 { 28 return flag; 29 } 30 if(vis[tmp] == 1) 31 { 32 return -1; 33 } 34 35 vis[tmp] = 1; 36 s1 = tmp.substr(0, length); 37 s2 = tmp.substr(length, length*2); 38 } 39 } 40 41 int main(int argc, char const *argv[]) 42 { 43 #ifdef debug 44 freopen("test.txt","r",stdin); 45 #endif 46 cin >> n; 47 for(int ii = 1; ii <= n; ii++) 48 { 49 cin >> length; 50 cin >> s1 >> s2 >> t; 51 52 ans = shuffle(); 53 54 cout << ii << " " << ans << endl; 55 } 56 return 0; 57 }