DFS POJ 3087 Shuffle'm Up

题目传送门

 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 }

DFS POJ 3087 Shuffle'm Up

时间: 2024-12-31 03:58:04

DFS POJ 3087 Shuffle'm Up的相关文章

POJ 3087 Shuffle&#39;m Up (DFS)

题目链接:Shuffle'm Up 题意:有a和b两个长度为n的字符序列,现定义操作: 将a.b的字符交叉合并到一个序列c,再将c最上面的n个归为a,最下面n个归为b 给出a,b和目标序列c,问最少多少次操作a.b转化为c 解析:将a.b放入哈希表,然后模拟操作过程直接dfs即可. AC代码: #include <cstdio> #include <iostream> #include <cstring> #include <map> using names

POJ 3087 Shuffle&#39;m Up (模拟)

Shuffle'm Up Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5850   Accepted: 2744 Description A common pastime for poker players at a poker table is to shuffle stacks of chips. Shuffling chips is performed by starting with two stacks of

POJ - 3087 Shuffle&#39;m Up (简单递归)

题意:将两个字符串模拟洗牌的操作合并问是否能得打答案,以及中间经过的次数,如果不能则输出-1 思路:这是一道模拟题,所以只需要写一个模拟操作,不断循环即可.同时还要判断循环结束条件(递归结束条件),如果自己手写一个例子的话就会发现其在不超过2*n(n为长度)次数就会洗回来 完整代码: #include <iostream> #include <cstdio> #include <cstring> #include <string> using namespa

POJ 3087 Shuffle&#39;m Up(模拟退火)

Description A common pastime for poker players at a poker table is to shuffle stacks of chips. Shuffling chips is performed by starting with two stacks of poker chips, S1 and S2, each stack containing C chips. Each stack may contain chips of several

POJ 3087 Shuffle&#39;m Up (模拟+map)

题目链接:http://poj.org/problem?id=3087 题目大意:已知两堆牌s1和s2的初始状态, 其牌数均为c,按给定规则能将他们相互交叉组合成一堆牌s12,再将s12的最底下的c块牌归为s1,最顶的c块牌归为s2,依此循环下去. 现在输入s1和s2的初始状态 以及 预想的最终状态s12.问s1 s2经过多少次洗牌之后,最终能达到状态s12,若永远不可能相同,则输出"-1". 解题思路:照着模拟就好了,只是判断是否永远不能达到状态s12需要用map,定义map<

[暴力搜索] POJ 3087 Shuffle&#39;m Up

Shuffle'm Up Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10003   Accepted: 4631 Description A common pastime for poker players at a poker table is to shuffle stacks of chips. Shuffling chips is performed by starting with two stacks o

(简单) POJ 3087 Shuffle&#39;m Up,枚举。

Description A common pastime for poker players at a poker table is to shuffle stacks of chips. Shuffling chips is performed by starting with two stacks of poker chips, S1 and S2, each stack containing C chips. Each stack may contain chips of several

模拟/poj 3087 Shuffle&#39;m Up

1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 char s1[110],s2[110],ss[220]; 5 int len,n; 6 7 int f() 8 { 9 int ans=0; 10 char t1[110],t2[110],tt[220]; 11 strcpy(t1,s1);strcpy(t2,s2); 12 while (1) 13 { 14 ans++; 15 for (int i=

POJ 3087 Shuffle&#39;m Up

POJ 3087 Shuffle'm Up Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8843   Accepted: 4078 Description A common pastime for poker players at a poker table is to shuffle stacks of chips. Shuffling chips is performed by starting with two