《阿哈!算法》4-1不撞南墙不回头——深度优先搜索

深度优先搜索关键在于解决“当下该如何做”。至于下一步如何做“则与”当下该如何做“是一样的。

 

 


#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <string.h>

const  int max=1000;

int a[10],book[10],n;//c语言全局变量在没有赋值以前默认为0
void dfs(int step){     //step表示站在第几个盒子面前
    if(step==n+1){      //如果站在第n+1个盒子面前,则表示前n个盒子已经放好扑克牌
        //输出一种排列
        for(int i=1;i<=n;i++)
            printf("%d",a[i]);
        printf(" ");
        return;         //return返回之前的一步,最近一次调用dfs函数的地方
    }
    
    //此时站在第step个盒子面前,应该放哪张牌呢?按照1,2,3···n的顺序试一下
    for (int i=1; i<=n; i++) {
        //判断扑克牌i是否还在手上
        if (book[i]==0) {//将book[i]设为0,表示i号扑克牌还在手上
            //开始尝试使用扑克牌
            a[step]=i;  //将i号扑克牌放到第step个盒子中
            book[i]=1;  //将book[i]设为1,表示i号扑克牌已经不在手上
            
            //第step个盒子已经放好扑克牌,接下来需要走到下一个盒子面前
            dfs(step+1);//通过递归处理第step+1个盒子
            book[i]=0;  //一定要将刚才尝试的扑克牌收回,才能进行下一次尝试
        }
    }
}
int main() {
    scanf("%d",&n);//输入n为1~9之间的整数
    dfs(1);
    printf("\n");
    return 0;
}



运行结果:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章