一.深度优先
深度优先思想简单理解就是“一条路走到黑”,直到走到不能走,再后退寻找没有走过的路,直到无路可走。所以深度优先的关键在于“每一步只考虑当前这一步怎么做”。
应用:
1.输出1~n的全排列
把这个问题形象化:有n张牌,n个箱子,每个箱子都要编号1~n,每个箱子只能放一张牌,输出所有的可能。、
先走到第1个箱子前,此时可以有n张牌可以放,放一张后走到第2个箱子前,此时可以有n-1张牌可以,这样直到放完最后一张牌,此时已经有一种结果了。那么收回最后一张牌,发现这张牌放最后一个箱子还是已经出现的结果,那么就往后一步,这时再放入之前最后一张牌,就可以得到不同的结果了。所以我们每次放到最后一张牌,得出一个结果后收回牌,如果当前的牌已经出过了就往后退一步直到出现不同的结果。
代码实现
private static int num;//用于计数
public static void Func(int n)//n张牌n个箱子
{
num = 0;
int[] pokes = new int[n+1];
int[] boxs = new int[n+1];
for (int i = 1; i <= n; i++) { pokes[i] = i; }
Dfs(1, pokes, boxs);
}
private static void Dfs(int step, int[] pokes, int[] boxs)//每一步的操作
{
int k=boxs.Length;
if (step == k )//表示已经走到了第k个箱子之后了,没有箱子了,此时从头打印出之前n个箱子里的牌的数值
{
num++;
Console.Write("第" + num + "种方案:");
for(int i=1;i<k;i++)
{
Console.Write(boxs[i]+",");
}
Console.Write("\n");
return;
}
for (int i = 1; i < pokes.Length; i++)//依次抽出手中的牌
{
if (pokes[i]>0)//
{
boxs[step] = pokes[i];
pokes[i] = 0;// 表示该手牌已经没有了
Dfs(step + 1, pokes, boxs);
// boxs[i] = 0;
pokes[i] = i;//表示将刚才尝试的手牌收回。
}
}
return;
}