还是使递归的方法,根据题意我们要输出n个数的随机排列的全部情况,思路就有所不同,若当前有n个空位,便有n个选择,随空位的减少可供使用的数字也随之减少,于是我们需要两个数组,一个负责表示当前空位填入的数值,另一个则负责表示当前数字是否被使用过,之后不断深入与回溯,便可达到目的。
#include<cstdio> #include<string> #include<iostream> #include<algorithm> using namespace std; const int N = 10; int n,count; int sta[N]; bool used[N]; void dfs(int i) { if(i>n) //i>n时递归结束 { for(int j = 1;j<=n;j++) printf("%d ",sta[j]); //输出空格对应的数字 puts(""); return; } for(int j = 1;j<=n;j++) { if(!used[j]) //判断该数字没被使用过,否则继续查找 { sta[i] = j; //当前位置变为该数字 used[j] = true; //表示当前数字已使用 dfs(i+1); //选择下一位置的数字 used[j] = false; //重置使用 } } } int main() { scanf("%d",&n); dfs(1); return 0; }