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;  
}   
    原文作者:迷宫问题
    原文地址: https://blog.csdn.net/MM__1997/article/details/71775441
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞