题目传送门

 1 /*
 2     题意:两块扑克牌按照顺序叠起来后,把下半部分给第一块,上半部给第二块,一直持续下去,直到叠成指定的样子
 3     DFS:直接模拟搜索,用map记录该字符串是否被搜过。读懂题目是关键。
 4 */
 5 /************************************************
 6 Author        :Running_Time
 7 Created Time  :2015-8-3 13:57:55
 8 File Name     :POJ_3087.cpp
 9 *************************************************/
10 
11 #include <cstdio>
12 #include <algorithm>
13 #include <iostream>
14 #include <sstream>
15 #include <cstring>
16 #include <cmath>
17 #include <string>
18 #include <vector>
19 #include <queue>
20 #include <deque>
21 #include <stack>
22 #include <list>
23 #include <map>
24 #include <set>
25 #include <bitset>
26 #include <cstdlib>
27 #include <ctime>
28 using namespace std;
29 
30 #define lson l, mid, rt << 1
31 #define rson mid + 1, r, rt << 1 | 1
32 typedef long long ll;
33 const int MAXN = 5e3 + 10;
34 const int INF = 0x3f3f3f3f;
35 const int MOD = 1e9 + 7;
36 map<string, int> cnt;
37 string str;
38 bool vis[MAXN][MAXN];
39 int res, ct;
40 int n;
41 
42 void DFS(string s, string t, int dep)   {
43     if (!cnt.count (s))  cnt[s] = ++ct;
44     if (!cnt.count (t)) cnt[t] = ++ct;
45     if (vis[cnt[s]][cnt[t]])    return ;
46     vis[cnt[s]][cnt[t]] = true;
47     string tmp = "";
48     for (int i=0; i<n; ++i) {
49         tmp += t[i];    tmp += s[i];
50     }
51     if (tmp == str) {
52         if (res > dep)  res = dep;
53         return ;
54     }
55     s = ""; t = "";
56     for (int i=0; i<n; ++i) s += tmp[i];
57     for (int i=n; i<2*n; ++i)   t += tmp[i];
58     DFS (s, t, dep + 1);
59 }
60 
61 int main(void)    {       //POJ 3087 Shuffle'm Up
62     int T, cas = 0;  scanf ("%d", &T);
63     while (T--) {
64         scanf ("%d", &n);
65         string s, t;
66         cin >> s >> t;  cin >> str;
67         res = INF;  ct = 0; cnt.clear ();   memset (vis, false, sizeof (vis));
68         DFS (s, t, 1);
69         printf ("%d %d\n", ++cas, res == INF ? -1 : res);
70     }
71 
72     return 0;
73 }

 

编译人生,运行世界!