题目
思路
1.我们先可以从字符串的长度知道n是多少
n = (s.size()<=9) ? s.size() : (s.size()-9)/2 + 9;//求范围是1-n的n是多少
2.题目规定字符串的长度不超过100,那么我们只要枚举一位数和两位数即可,并把使用过的数进行标记,并且所有数都要小于等于n。
3.我们分为拆一位数,拆两位数
int x=s[u]-'0'; //拆一位
x=x*10+s[u+1]-'0'; //这里一定要注意是u+1的值 //拆两位
代码
#include<bits/stdc++.h>
using namespace std;
int ans[100];
string s;
int n;
bool vis[100];
bool ok;
//u:当前到了哪一位了
//cnt:当前拆出来了几个数了
void dfs(int u,int cnt){
if(ok) return;
if(u==s.size()){
for(int i=0;i<cnt;i++){
cout<<ans[i]<<" ";
}
cout<<endl;
ok=true;
return;
}
//拆一位
int x=s[u]-'0';
if(x==0) return;
if(0<x && x<=9 && !vis[x]){
ans[cnt]=x;
vis[x]=true;
dfs(u+1,cnt+1);
vis[x]=false;
}
//在考虑拆两位之前,必须要保证有两位可以拆
if(u+1>=s.size()) return;
//拆两位
x=x*10+s[u+1]-'0'; //这里一定要注意是u+1的值 这里一定要注意是u+1的值 这里一定要注意是u+1的值
if(x<=n && !vis[x]){
ans[cnt]=x;
vis[x]=true;
dfs(u+2,cnt+1);
vis[x]=false;
}
}
int main(){
cin>>s;
n = (s.size()<=9) ? s.size() : (s.size()-9)/2 + 9;//求范围是1-n的n是多少
dfs(0,0);
return 0;
}