POJ-3078.Shuffle'm Up(简单模拟题)

  这道题做了有四个小时吧,今天一整天都处于边玩边学的状态,我很是不喜欢...一开始用了20分钟模拟,过了样例后TLE了,就在考虑是不是判断是否重复判定的数组开大了,结果一直蛙,后面想到了map判重,结果由于还没有将BUG改完,都只是能过样例,最后看了题解,发现由于我菜将一个判断条件的位置写错了位置......

  本次主要就是写教训的,感觉自己可能是已经麻木了就没有去仔细找BUG,知道错了...

  本题大意:给出两个长度为len的字符串s1, s2和一个长度为2 * len的字符串s12,每次先让s2先s1后先后依次取一个字符得到一个长度为2 * len 的字符串s,如果发现得到的字符串s与s12相等就输出交换的次数,否则让s的左半边等于s1右半边等于s2再进行上面的变换,如果无法使的变换后的s == s12则输出-1。

  本题思路:模拟。

  参考代码:

 1 #include <string>
 2 #include <map>
 3 #include <iostream>
 4 using namespace std;
 5 
 6 int len, ans, kase = 0;
 7 bool flag;
 8 
 9 int main () {
10     int T;
11     cin >> T;
12     map <string, bool> vis;
13     while(T --) {
14         vis.clear();
15         string s1, s2, s12;
16         ans = 0;
17         cin >> len;
18         cin >> s1 >> s2 >> s12;
19         while(true) {
20             flag = true;
21             ans ++;
22             string str;
23             int i = 0;
24             for(int j = 0; j < len; j ++) {
25                 str += s2[i ++];
26                 str += s1[j];
27             }
28             if(vis[str] && str != s12) {
29                 ans = -1; //记得判重条件要放到最前面
30                 break;
31             }
32             vis[str] = true;
33             if(str == s12) break;
34             s1 = str.substr(0, str.size() / 2);
35             s2 = str.substr(str.size() / 2, str.size());
36         }
37         cout << ++ kase << " " << ans << endl;
38     }
39     return 0;
40 }
View Code
原文地址:https://www.cnblogs.com/bianjunting/p/10485970.html