DFS实现走迷宫

Description

给一张个迷宫,问能否从起点走到终点,只能往上下左右走,不能斜着走

Input

多组测试数据,每组第一行两个正整数,分别为n和m

表示n这个迷宫有n行m列(0<n,m<10)

接着是n行m列,

‘#’表示路

‘*’表示墙

‘S’表示起点

‘T’表示终点

Output

每组测试数据输出一个结果,如果能从S走到T,输出“YES”,否则输出“NO”

Sample Input

2 2
S*
#T
3 3
S*#
#*T
##*

Sample Output

YES
NO
代码如下:

#include <cstdio>
#include <cstring>
using namespace std;
//定义常量数组,方向为上、下、左、右四个方向
const int dx[]={-1,0,1,0};
const int dy[]={0,1,0,-1};
char c[10][10];//定义字符数组
int visit[10][10];//定义访问数组,访问标记为1,未访问标记为0
int n,m,re;//字符数组的行数,列数和返回值
void dfs(int x,int y){
    visit[x][y]=1;
    if(c[x][y]=='T'){
        re=1;
        return;
    }
    for(int i=0;i<4;i++){
        int x1=x+dx[i];
        int y1=y+dy[i];
        if(x1>=0&&y1>=0&&x1<n&&y1<m&&visit[x1][y1]==0&&c[x1][y1]!='*')
            dfs(x1,y1);
    }
}
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF){
        memset(c,'\0',sizeof(c));
        memset(visit,0,sizeof(visit));
        re=0;
        for(int i=0;i<n;i++){
            getchar();
            scanf("%s",c+i);
        }
        int p,q;
        //找出起点的坐标
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(c[i][j]=='S'){
                    p=i;
                    q=j;
                    break;
                }
            }
        }
        dfs(p,q);
        if(re==1)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

之前出错的原因是一直没有写好DFS里面的结束条件,就导致程序出现无限循环,标记数组很重要!!

    原文作者:迷宫问题
    原文地址: https://blog.csdn.net/zhazhabin/article/details/51195277
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞