计蒜客 置换的玩笑(DFS)

传送门

题目大意:

小蒜头又调皮了。这一次,姐姐的实验报告惨遭毒手。

姐姐的实验报告上原本记录着从 1 到 n 的序列,任意两个数字间用空格间隔。但是“坑姐”的蒜头居然把数字间的空格都给删掉了,整个数字序列变成一个长度为 1 到 100 的且首部没有空格的数字串。

现在姐姐已经怒了,蒜头找你写个程序快点把试验数据复原。

输入

输入文件有一行,为一个字符串——被蒜头搞乱的实验数据。

字符串的长度在 1 到 100 之间。

输出

输出共一行,为姐姐的原始测试数据—— 1 到 n 的输出。

任意两个数据之间有一个空格。

如果有多组符合要求的正确解,输出其中任意一组即可。

本题答案不唯一,符合要求的答案均正确

样例输入

4111109876532

样例输出

4 1 11 10 9 8 7 6 5 3 2

解题思路:

因为字符串的长度不超过100,可以计算出n最大是54,我们只需要枚举一位数和两位数。

先通过字符串的长度计算出n,开一个数组标记枚举过的数,只有没标记过的数并且小于等于n才会存下来继续往后搜。

size<=9: n=size

size>9:  n=(size-9)/2+9

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <iostream>
 4 #include <string>
 5 #include <math.h>
 6 #include <algorithm>
 7 #include <vector>
 8 #include <stack>
 9 #include <queue>
10 #include <set>
11 #include <map>
12 #include <sstream>
13 const int INF=0x3f3f3f3f;
14 typedef long long LL;
15 const int mod=1e9+7;
16 const double PI = acos(-1);
17 const double eps =1e-8;
18 #define Bug cout<<"---------------------"<<endl
19 const int maxn=1e5+10;
20 using namespace std;
21 const int prime[15]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};
22 
23 string str;
24 int n;//提前计算出,可用来剪枝 
25 int ans[105]; 
26 bool vis[105];//判断某个数出现没 
27 bool flag;
28 
29 void DFS(int step,int num)//step表示第几个字符,num表示已经找到了num个数 
30 {
31     if(flag) return;//最优性剪枝 
32     if(step==str.size())
33     {
34         for(int i=0;i<num;i++)
35         {
36             if(i==0) cout<<ans[i];
37             else cout<<' '<<ans[i];
38         }
39         cout<<endl;
40         flag=true;
41         return ;
42     }
43     int t=str[step]-'0';
44     if(t<=n&&!vis[t])//搜一位 
45     {
46         ans[num]=t;
47         vis[t]=true;
48         DFS(step+1,num+1);
49         vis[t]=false;
50     }
51     if(step!=str.size()-1)
52     {
53         t=t*10+str[step+1]-'0';
54         if(t<=n&&!vis[t])//搜两位 
55         {
56             ans[num]=t;
57             vis[t]=true;
58             DFS(step+2,num+1);
59             vis[t]=false;
60         }
61     }
62 }
63 
64 int main()
65 {
66     #ifdef DEBUG
67     freopen("sample.txt","r",stdin);
68     #endif
69 //    ios_base::sync_with_stdio(false);
70 //    cin.tie(NULL);
71     
72     cin>>str;
73     n=str.size()<=9?str.size():(str.size()-9)/2+9;
74     DFS(0,0);
75     
76     return 0;
77 }

-

原文地址:https://www.cnblogs.com/jiamian/p/12178818.html