题目
题意:一个$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 ? ' ' : ' '); 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 }