<span style="font-family: Arial, Helvetica, sans-serif;"><img src="https://img-blog.csdn.net/20160326200651704?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /></span>
<span style="font-family: Arial, Helvetica, sans-serif;">#include<stdio.h></span>
int a[10];
int book[10];
void dfs(int step)
{
int i;
if(step==4)//表示前 3 个框框已经放好
{
for(i=1;i<=3;i++)
{
printf("%d",a[i]);
}
printf("\n");
return ;//返回的是最近一次调用dfs;调用的是dfs(3)然后执行book[i]=0;
}
else
{
for(i=1;i<=3;i++)
{
if(book[i]==0)
{
a[step]=i;
book[i]=1;//i已经被放置
dfs(step+1);//当前放置好后放第n+1个
book[i]=0;//把i退回
}
}
}
}
int main()
{
dfs(1);
return 0;
}book[4]用来标记数字i是否被使用过
step表示当前选择第step个框框来放置数字
a[step]=i表示第step个框框中放置的数字为i
一共3个数放置在a[4]中(下标从1开始)
1 2 3 放好后 return 把3收回发现只有3可选 继续退回 得到 2 即变成 1 3 2<pre name="code" class="objc">#include<stdio.h>
int a[10],book[10];
int n;
int b[10];
void dfs(int step)
{
int i;
if(step==n+1)//如果a【i-n】所有数都已经放好
{
for(i=1;i<=n;i++)
{
printf("%d ",b[i]);
}
printf("\n");
return ;
}
for(i=1;i<=n;i++)//b中可防止a【1-n】的所有数
{
if(book[i]==0)
{
b[step]=a[i];
book[i]=1;//a【i】被使用
dfs(step+1);//继续处理下一个数
book[i]=0;
}
}
}
int main()//输入N个数的排列,由上变形
{
int i;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
dfs(1);//从第一个开始
return 0;
}