pku 3087 Shuffle'm Up 说的是bfs,其实就是个模拟
http://poj.org/problem?id=3087
刚看到题目的时候给我整蒙了,BFS怎么做啊?这不就是模拟一下洗牌的过程,如果遇到目标字符串就输出步数,如果回到原始串,就说明到不了目标串。
View Code
#include <iostream> #include <cstdio> #include <cstring> #include <queue> using namespace std; char aim[207];//目标串 int n; struct node { char s1[107]; char s2[107]; int len; }; bool isok(char *s,int start)//检查串 { for (int i = start, j = 0; j < n; ++j,++i) { if (aim[i] != s[j]) return false; } return true; } int bfs(char *s1,char *s2) { node s; queue<node>q; strcpy(s.s1,s1); strcpy(s.s2,s2); s.len = 0; q.push(s); int sum = -1; bool flag = false;//拥有标记不是初始串 //int test = 10; while (!q.empty()) { node cur = q.front(); q.pop(); if (isok(cur.s1,0) && isok(cur.s2,n))//找到目标串 { sum = cur.len; break; } if (flag && !strcmp(cur.s1,s1) && !strcmp(cur.s2,s2)) break;//回到原始串 flag = true; char str[207]; int i = 0; int l = 0; node tt; for (i = 0; i < n; ++i) { str[l++] = cur.s2[i]; str[l++] = cur.s1[i]; } str[l] = '\0'; //printf(">>>>>%s\n",str); for (i = 0; i < n; ++i) tt.s1[i] = str[i]; tt.s1[n] = '\0'; for (i = n; i < 2*n; ++i) tt.s2[i - n] = str[i]; tt.s2[n] = '\0'; //printf(">>>>>%s %s %s\n",str,tt.s1,tt.s2); tt.len = cur.len + 1; q.push(tt); } return sum; } int main() { char s1[107],s2[107]; int t,cas = 1; scanf("%d",&t); while (t--) { scanf("%d",&n); scanf("%s%s",s1,s2); scanf("%s",aim); int flag = bfs(s1,s2); printf("%d %d\n",cas++,flag); } return 0; }