第4章第1节-不撞南墙不回头-深度优先搜索

/*使用深度优先搜索解决数的全排列问题*/
/*
深度优先搜索的基本模型:
void dfs(int step)
{
    判断边界
    尝试每一种可能 for(i = 1;i <= n;i++)
    {
    继续下一步 dfs(step + 1);
    }
    返回
}
*/

#include "stdio.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个盒子已经放好扑克牌
    {
        //输出一种排列(1~n号盒子中的扑克牌编号)
        for(i = 1;i <= n;i++)
        {
            printf("%d",a[i] );
        }
        printf("\n");
        return;//返回之前的一步(最近一次调用dfs函数的地方)
    }

    //此时站在step个盒子面前,应该放那张牌呢?
    //按照1,2,3。。。n的顺序一一尝试
    for(i = 1;i <= n;i++)
    {
        //判断扑克牌i是否还在手上
        if(book[i] == 0)//book[i] == 0表示i号扑克牌还在手上
        {
            //开始尝试使用扑克牌i
            a[step] = i;//将i号扑克牌放入step号盒子中
            book[i] = 1;//将book[i]设置为1,表示i号扑克牌已不再手中

            //将step个盒子已经放好扑克牌,接下来需走到下个盒子面前
            dfs(step + 1);//这里通过函数的递归调用来实现(自己调用自己)
            book[i] = 0;//这是非常重要的一步,一定要将刚才尝试的扑克牌收回,才能进行下一次尝试
        }
    }
    return;
}

int main()
{
    scanf("%d",&n);//输入时要注意n为1~9的整数
    dfs(1);//首先站在1号小盒子面前
    getchar();getchar();
    return 0;
}
/*
示例输入:
3
示例输出:
123
132
213
312
321
*/

猜你喜欢

转载自blog.csdn.net/perfect_zdq/article/details/89285701
今日推荐