呼。。。改了半天,原来就是交换的时候s1和s2的顺序弄反了。。。然后检查了3个小时TAT。小错误频发,罪过啊罪过。
题目大意:给定一组牌,s1和s2,然后s1s2交叉洗牌形成了s12。洗牌过程是一张一张的插入,然后s2的最后一张在最底端(注意,陷阱一:题目中给的测试数据是从最底端开始的)。然后将组成的s12拆分开,上面一半是s2,下面一半是s1。然后重复该操作。
个人的思考:
只要有重复操作,就相当于形成了环,那就是不成立。然后运用set的唯一性,塞进去就可以了。
这个小错误真是让我 心累啊QAQ
后来又写了一下map的,也就是在set上面稍微修改了一下,那就先贴map的再贴set的吧
#include<cstdio> #include<cstring> #include<algorithm> #include<string> #include<cmath> #include<queue> #include<set> #include<map> using namespace std; int l, res; char s12[500 + 5]; char s1[205], s2[205]; struct node{ char aim[200 + 5]; }nod; queue <node> que; map <string int=""> s; //上面一行不知道为啥贴出来就变了,大家自己改一下吧 node work(node nod){ for (int i = 0; i < l; i++){ s1[i] = nod.aim[i];//拆分操作前面是s1后面是s2 s2[i] = nod.aim[i + l]; } node mid; memset(mid.aim, 0, sizeof(mid.aim)); int ind = 0; for (int i = 0; i < 2 * l; i += 2){ mid.aim[i] = s2[ind++]; } ind = 0; for (int i = 1; i < 2 * l; i += 2){ mid.aim[i] = s1[ind++]; } return mid; } void init(){ memset(nod.aim, 0, sizeof(nod.aim)); int ind = 0; for (int i = 0; i < 2 * l; i += 2){ nod.aim[i] = s2[ind++]; } ind = 0; for (int i = 1; i < 2 * l; i += 2){ nod.aim[i] = s1[ind++]; } while (!que.empty()) que.pop(); s.erase (s.begin(), s.end());//① } bool cmp(node nod, char s12[]){ for (int i = 0; i < 2 * l; i++){ if (nod.aim[i] != s12[i])return false; } return true; } void dfs(){ init(); que.push(nod); s[nod.aim] = 1; int cnt = 1; while (!que.empty()){ nod = que.front(); que.pop(); if (cmp(nod, s12)){ printf("%d %d\n", ++res, cnt); return ; } nod = work(nod); if (s[nod.aim] == 1){ printf("%d %d\n", ++res, -1); return ; } else s[nod.aim] = 1; cnt++; que.push(nod); } printf("%d\n", cnt = -1); } int main(){ int T; scanf("%d", &T); while (T--){ memset(s1, 0, sizeof(s1)); memset(s2, 0, sizeof(s2)); memset(s12, 0, sizeof(s12)); scanf("%d", &l); scanf("%s", s1); scanf("%s", s2); scanf("%s", s12); dfs(); } return 0; } </string></node></map></set></queue></cmath></string></algorithm></cstring></cstdio></string>
set的