#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 45;
string s;
int n;
//vector<bool> vis(n+1,false); //在这里定义是不行的,此时n还是0,所以默认vis只有1个空间
void backtrace(int index,int cnt,vector<bool>& vis) {
if(index>=s.length()) {
if(cnt==n-1) { //划分出了n-1个数字了
// cout<<"miao..."<<endl;
vector<bool>::iterator it;
it = find(vis.begin()+1,vis.end(),false);//false的下标是(排除掉0)
//printf("%d",*it);
// cout<<it-vis.begin()<<endl;
printf("%d\n",it-vis.begin());
// for(int i=0; i<vis.size(); i++) {
if(vis[i]==false)cout<<i<<endl;
// cout<<"for..."<<endl;
// }
// cout<<"vis.size():"<<vis.size()<<endl;//规模变成1了? 因为在main外面初始化时n还没有被赋值!
}
return;
}
if(s[index]=='0') return;//剪枝
if(index<s.length()-1) {
int tmp1 = (s[index]-'0')*10+(s[index+1]-'0');
if(tmp1>=1 && tmp1<=n && vis[tmp1]==false) {
//cout<<"tmp1:"<<tmp1<<endl;
cnt++;
vis[tmp1]=true;
backtrace(index+2,cnt,vis);
cnt--;
vis[tmp1]=false;
}
}
/*下面这一块代码要放在index<s.length()-1外面,因为还有最后一个需要判断啊!!!!!!!!!!!!!!!!!!*/
int tmp2 = s[index]-'0';
if(tmp2>=1 && tmp2<=n &&!vis[tmp2]) {
//cout<<"tmp2:"<<tmp2<<endl;
cnt++;
vis[tmp2]=true;
backtrace(index+1,cnt,vis);
cnt--;
vis[tmp2]=false;
}
return;
}
int main() {
scanf("%d",&n);
vector<bool> vis(n+1,false);
getchar();
cin>>s;
backtrace(0,0,vis);
return 0;
}
代码参考自:https://blog.csdn.net/climber16/article/details/81604342