将n张扑克放在n个盒子中,有哪些全排列。
思路:
利用深度优先搜索。
深度优先搜索关键在于解决“当下该如何做”。至于“下一步该如何做”则和“当下该怎么做”是一样的。
void dfs(int step)
{
判断边界
尝试每一种可能 for(i=1;i<=n;i++)
{
继续下一步 dfs(step+1);
}
返回
}
#include <iostream>
using namespace std;
int a[10],book[10],n; //全局变量未赋值前均默认为0
void dfs(int step) //step表示站在第几个盒子面前
{
int i;
if(step==n+1) //如果站在第n+1个盒子面前表示前n个盒子已放好
{
for(i=1;i<=n;i++) //输出一种全排列
cout<<a[i]<<" ";
cout<<endl;
return; //递归出口,返回
}
//盒子里放哪张牌,按照1,2,3...的顺序一一尝试
for(i=1;i<=n;i++)
{
//判断扑克牌是否在手上
if(book[i]==0) //表示在手上
{
a[step]=i; //将i放在第step个盒子中
book[i]=1; //表示i扑克牌已不在手上
//接下来需走到下一个盒子面前
dfs(step+1);
book[i]=0; //将刚才放完的扑克牌一一收回,再进行下一次尝试
}
}
return;
}
int main()
{
cin>>n; //输入为1~9之间的整数
dfs(1); //首先站在1号盒子面前
return 0;
}
运行结果: