置换的玩笑——DFS&&暴力

题目

链接

题意:一个$1$到$n$的序列被去掉空格,需要将其还原。例如$4111109876532$可还原成$4 \ 1 \  11 \  10 \  9 \  8 \  7 \  6 \  5 \  3 \  2$。字符串的长度在$1$到$100$之间。

解决方法

由于是1到n的序列,根据长度可以求出n。

由于长度不超过100,所以n不超过54,即最多两位数。因此只需分别取首部的1位和2位,进行记录,对剩下的递归。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int maxn = 100+10;
 5 char s[maxn];
 6 int n, len;
 7 
 8 int getnum1(int index)
 9 {
10     return s[index] - '0';
11 }
12 int getnum2(int index)
13 {
14     return (s[index] - '0') * 10 + s[index + 1] - '0';
15 }
16 
17 int res[maxn];
18 bool vis[maxn];
19 int cnt = 0;
20 bool dfs(int index)
21 {
22     if(index >= len)
23     {
24         bool flag = true;
25         for(int i = 1; i < n;i++)
26             if(!vis[i])  flag = false;
27         if(flag)
28         {
29             for(int i = 0;i < cnt;i++)
30                 printf("%d%c", res[i], i == cnt - 1 ? '\n' : ' ');
31             return true;
32         }
33         return false;
34     }
35 
36 
37     int num1 = getnum1(index);
38     if(num1 > n)  return false;
39     if(!vis[num1])
40     {
41         vis[num1] = true;
42         res[cnt++] = num1;
43         if(dfs(index + 1))  return true;
44 
45         vis[num1] = false;
46         cnt--;
47     }
48 
49     int num2 = getnum2(index);
50     if(num2 > 54 || num2 > n)  return false;  //长度为100,n最大为54
51 
52     if(index < len - 1 && !vis[num2])
53     {
54         vis[num2] = true;
55         res[cnt++] = num2;
56         if(dfs(index + 2))  return true;
57 
58         vis[num2] = false;
59         cnt--;
60     }
61 
62     return false;
63 }
64 
65 int main()
66 {
67     scanf("%s", s);
68     len = strlen(s);
69     if(len <= 9)  n = len;
70     else  n = (len - 9) / 2 + 9;
71 
72     dfs(0);
73 
74     return 0;
75 }

 

posted @ 2019-07-04 22:16  Rogn  阅读(304)  评论(0编辑  收藏  举报