拿输入3为例子,首先要从1开始一个一个搜索,输出一遍开始回溯,即123输出之后开始回溯,a【i】重新赋值标记的为0,a【i-1】也为0,由于for的循环,所以结束,输出132,同样回溯的过程也会回溯到第一个数,就是213,同理循环下去,直到回溯完输出完程序继续输入想排的个数。
#include<cstdio>
#include<cstring>
using namespace std;
int a[10],vis[10],n; // 存数数组,标记数组,几位数
void dfs(int step)
{
if(step == n + 1 ) //排一遍输出
{
for(int i = 1 ; i <= n ; i ++)
printf("%d",a[i]);
printf("\n");
}
for(int i = 1 ; i <= n ; i ++)
{
if(vis[i] == 0 )
{
a[step] = i ;
vis[i] = 1 ;
dfs(step + 1); //递归
vis[i] = 0 ; //回溯
}
}
}
int main()
{
memset(vis,0,sizeof(vis)); //初始化标记数组为 0
while(~scanf("%d",&n))
{
dfs(1);
printf("\n"); //从一开始往里搜索
}
return 0;
}