POJ 3984 迷宫问题(dfs)

迷宫问题
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 18595 Accepted: 11004

Description

定义一个二维数组: 
int maze[5][5] = {

	0, 1, 0, 0, 0,

	0, 1, 0, 1, 0,

	0, 0, 0, 0, 0,

	0, 1, 1, 1, 0,

	0, 0, 0, 1, 0,

};

它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

Input

一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。

Output

左上角到右下角的最短路径,格式如样例所示。

Sample Input

0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0

Sample Output

(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)
 
 
 
 
 
dfs的题目 求迷宫的最短路径 
思路是 设置一个方向数组来控其行走的方向 若其该方向上的点满足条件则记录该点并标记且以该点为结点进行下一步搜索 
若不满足条件 换另一方向重新进行 每当有一条路径到达终点 判断其步数是否小于之前最小路径 是则刷新最终路径数组


AC代码:
#include <stdio.h>  
#include <string.h>  
struct node{  
    int x;  
    int y;  
};  
  
node a[100];//记录最终路径   
node tempa[100];//记录中间路径   
  
int vis[10][10];  
int dir[4][2]={1,0,0,1,-1,0,0,-1};//方向数组   
int min=9999;     
int map[10][10];  
  
void dfs(int x,int y,int step){  
    if (x==4&&y==4){  
        if (min>step){//找出最短路径   
            min=step;  
            for (int i=0;i<step;i++){  
                a[i]=tempa[i];  
            }  
        }  
        return ;  
    }  
    for (int k=0;k<4;k++){  
        int i=x+dir[k][0];  
        int j=y+dir[k][1];  
        if (i>=0&&j>=0&&i<5&&j<5&&map[i][j]==0&&vis[i][j]==0){//判断条件 数组不越界 点未被访问过 可走的路0  
            tempa[step].x=i;  
            tempa[step].y=j;  
            vis[i][j]=1;//状态变化   
            dfs(i,j,step+1);//搜索   
            vis[i][j]=0;//状态还原   
        }  
    }   
      
}   
  
int main (){  
  
    for (int i=0;i<5;i++){  
        for (int j=0;j<5;j++){  
            scanf ("%d",map[i]+j);  
        }  
    }  
    memset(vis,0,sizeof(vis));//将迷宫中的所有点都标记为未被访问状态   
    vis[0][0]=1;//将初始位置标记为已被访问   
    dfs(0,0,0);  
    printf ("(0, 0)\n");  
    for (int i=0;i<min;i++){  
        printf ("(%d, %d)\n",a[i].x,a[i].y);  
    }  
    return 0;  
}   



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值