先上代码
[mw_shl_code=c,true]#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int a[10],book[10],n;//C语言的全局变量在没有赋值以前默认为0,因此这里的book数组无需全部再次赋值为0
void dfs(int step)//step表示现在站在第几个盒子面前
{
int i;
if(step==n+1)//如果站在第n+1个盒子面前,表示前n个盒子已经放好了扑克牌 这里假设n为3那么 1==3+1不成立跳到下面for循环那
{
//输出一种排列(1-n号盒子中的扑克牌编号)
for(i=1;i<=n;i++)
printf("%d",a);
printf("\n");
return;//返回之前的一步(最近一次调用dfs函数的地方)
//虽说void没有返回值 但是也可以用return只是不能加数字
}
//此时占地第step个盒子面前
//按照1,2,3,...n的顺序一一尝试
for(i=1;i<=n;i++)
{
//判断扑克牌i是否还在手上
if(book==0)//等于0表示i号扑克牌在手上
{
//开始尝试使扑克牌i
a[step]=i;//将i号扑克牌放入到第step个盒子中
book=1; //将book设为1,表示i号扑克牌已经不再手上
//第step个盒子已经放好扑克牌,接下来需要走到下一个盒子面前
dfs(step+1);//这里通过函数的递归调用来实现(自己调用自己)
book=0;//这是非常重要的一步,一定要将刚才尝试的扑克牌收回,才能进行下一次尝试
}
}
return;
}
int main()
{
scanf("%d",&n);//输入的时候要注意n为1-9之间的整数
dfs(1);//首先站在1号小盒子面前
system("pause");
return 0;
}[/mw_shl_code]
假如输入的n是3 那么顺序就应该是
if(1==3+1)不成立
for(i=1;i<=3;i++)
if(book[1]==0)成立
a[1]=1;
book[1]=1;
dfs(2)
然后
if(2==3+1)不成立
依次类推
重点来了
当
dfs(4)时
if(4==3+1)成立
打印123 换行
return; 返回到之间的一步
(下面就是我自己理解的顺序)
dfs(3+1)
然后
book[3]=0;
然后后面我就不知道是怎么循环到把book[2]=0;
大概操作是打印123 收回23 打印132
望各位 指点
上面的循环顺序全部是自己理解的 如果有错误请指正
|