P1088 [NOIP2004 普及组] 火星人 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include<bits/stdc++.h>
using namespace std;
const int N=10010;
//const int inf=-0x3f3f3f;
bool st[N]; //true表示这个数已经被选过,false表示这个数没被选过
int n,m; //n是火星人手指的数目,m是要加上去的小整数
int arr[N]; //记录方案
int huo[N]; //存火星人给的数
int sum; //组合数个数
bool flag;
void dfs(int x) { //x表示现在是哪个位置
if(flag==true){
return;
}
if(x>n) { //说明前n个位置都填好了数
sum++; //sum是个数,也是代表的数字
if(sum==m+1) {
flag=1;
for(int i=1; i<=n; i++) {
printf("%d ",arr[i]);
}
}
return;
}
for(int i=1; i<=n; i++) { //注意到底哪个是x,哪个是i
if(!sum){
i=huo[x]; //从火星人给的开始
}
if(st[i]==false) {
st[i]=true;
arr[x]=i;
dfs(x+1);
st[i]=false; //恢复现场
arr[x]=0; //数组也要恢复现场
}
}
}
int main() {
scanf("%d\n%d",&n,&m);
for(int i=1; i<=n; i++) {
scanf("%d",&huo[i]);
}
dfs(1);
return 0;
}