深度优先搜索

深度优先搜索 Depth First Search(DFS)

  1. 有编号为1,2,3,4的4张扑克牌和编号为1,2,3,4的4个盒子。现在需要将这4张扑克牌分别放到4个盒子里,并且每个盒子只能放一张扑克牌,一共有多少种方法?
#include <stdio.h>
int sum=0, n, book[10]={0},a[10]={0};  //book:手中的牌 a:盒子
void dfs(int step){
    int i;
    if (step == n+1){ // 如果站在第n+1个盒子面前,则表示前n个盒子已经放好扑克牌
        sum++;
        for(i=1;i<=n;i++){
            printf("%d ",a[i]); 
        }
    printf("\n");
    return ;
    }
    for(i=1; i<=n; i++){
        if(book[i] == 0){
        a[step] = i;
        book[i] = 1;
        dfs(step+1);
        book[i] = 0;
        }
    } 
}
int main(){

    do{
        printf("请输入牌的总数(1-9):");
        scanf("%d",&n); // 有n张牌放入n个盒子中 n:1,2,3,...,n
        printf("\n");
    }while(n<1 || n > 9);

    dfs(1);
    printf("total ways:%d",sum);
    printf("\n");
    return 0;
}

2.手上有编号为1-9的9张扑克牌,然后将这9张扑克牌放到9个盒子里,使得 a b c + d e f = g h i 成立。

// 判断a[1] * 100 + a[2] * 10 + a[3] + a[4] * 100 + a[5] * 10 + a[6] == a[7]*100 + a[8] * 10 + a[9] 是否成立
#include <stdio.h>
void dfs(int step){
    int i;
    if(step == 10){
        if(a[1] * 100 + a[2] * 10 + a[3] + a[4] * 100 + a[5] * 10 + a[6] == a[7]*100 + a[8] * 10 + a[9]){
        for(i = 1;i<=9; i++){
        printf("%d ",a[i]);
        if(i==3) printf("+");
        if(i==6) printf("=");
        }
        printf("\n");
    }
    return ;
    }
    for(i = 1; i <=9; i++){
        if(book[i] == 0){
            a[step] = i;
            book[i] = 1;
            dfs(step+1);
            book[i] = 0;        
        }
    }
    return ;
}

3.迷宫找人
迷宫由n行m列的单元格组成(n, m <= 50),每个单元格要么是空地,要么是障碍物。找到一条从迷宫的起点通往人所在位置的最短路径。障碍物不能走,也不能走到迷宫之外。

// 用二维数组来存储这个迷宫,入口为(1,1),人在(p,q),就是找(1,1)到(p,q)的最短路径
#include<stdio.h>
int n,m,p,q,min=999999,book[51][51]={0},a[51][51]={0};
int next[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
void maze_dfs(int x, int y, int step){
    int k,tx,ty;
    // 判断是否终点
    if(x == p && y == q){
        if(step < min)
            min =step;
        return ;
    }
    // 不是终点就有4个方向可以走
    for(k=0;k<=3;k++){
        tx = x + next[k][0];
        ty = x + next[k][1];
        if(tx < 1 || tx > n || ty < 1 || ty > m)
            continue;
        //判断该点是否为障碍物或者已经在路径中
        if(a[tx][ty] == 0 && book[tx][ty] == 0){
            book[tx][ty] = 1;
            maze_dfs(tx,ty,step+1);
            book[tx][ty] = 0;
        }
    }
    return ;

}
int main(){
    int i,j,startx,starty;
    do{
    printf("请输入迷宫大小,n行m列: n,m<=50,以空格分隔,以回车结束:");
    scanf("%d %d",&n,&m);
    }while(n < 0 || m < 0 || n > 50 || m > 50);

    printf("输入迷宫,0:空地 1:障碍物\n");
    for(i = 1; i <= n; i++){
        for(j = 1; j <=m; j++){
            scanf("%d",a[i][j]);
        }
    }
    printf("输入的迷宫为:\n");
    for(i = 1; i <= n; i++){
        for(j = 1; j <=m; j++){
            printf("%d ",a[i][j]);
        }
        printf("\n");
    }
    printf("输入起点和目的地:");
    scanf("%d %d %d %d", &startx, &starty, &p, &q);
    maze_dfs(startx, starty, 0);
    printf("\n最少走%d步\n",min);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值