• 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
    ", ++cas, res == INF ? -1 : res);
    70     }
    71 
    72     return 0;
    73 }
    编译人生,运行世界!
  • 相关阅读:
    BZOJ1293: [SCOI2009]生日礼物
    BZOJ2326: [HNOI2011]数学作业
    BZOJ1179: [Apio2009]Atm
    树链剖分的一个小细节
    BZOJ1146: [CTSC2008]网络管理Network
    BZOJ1984: 月下“毛景树”
    BZOJ3196: Tyvj 1730 二逼平衡树
    BZOJ1579: [Usaco2009 Feb]Revamping Trails 道路升级
    BZOJ1674: [Usaco2005]Part Acquisition
    Babel 在浏览器环境使用方法
  • 原文地址:https://www.cnblogs.com/Running-Time/p/4700340.html
Copyright © 2020-2023  润新知