1126: 走迷宫

题目描述

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

输入

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

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

接着是n行m列,

'#'表示路

‘*’表示墙

‘S’表示起点

‘T’表示终点

输出

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

样例输入
2 2
S*
#T
3 3
S*#
#T
##

样例输出
YES
NO

分析与解答
我们先从第一个走的,因此先把第一个格子标记为已走过,然后开始走第一个格子上下左右的相邻格子,如果这个相邻格子没走过,而且从这个相邻格子能走到下一个格子,那么就可以一直走下去,继续调用dfs。
当调用dfs直到无法走下一个格子,这时直接返回flag=0,然后回到上一个格子,直到返回到最开始的那个格子,此时最开始的格子走另一个方向的格子。然后继续重复之前的调用,直到找到终点。

code:


#include<bits/stdc++.h>
using namespace std;
int n,m,flag;
int vis[15][15];//vis辅助数组
char a[15][15];
int step_x[4]= {-1,1,0,0},step_y[4]= {0,0,-1,1};//方向数组,左右四个方向;
void DFS(int x,int y)
{
    vis[x][y]=1;//标记一个起点使用过
    if(a[x][y]=='T')
    {
        flag=1;
        return;
    }
    for(int i=0; i<4; i++)//上下左右找路
    {
        int h=x+step_x[i];
        int l=y+step_y[i];
        if(a[h][l]!='*'&&!vis[h][l]&&h>=0&&h<n&&l>=0&&l<m)//搜索的条件
        {
            DFS(h,l);//递归调用DFS函数找路
        }
    }
}
int main()
{
    while(cin>>n>>m)
    {
        memset(vis,0,sizeof(vis));//初始化vis数组的值为0
        int f,g;
        flag=0;
        for(int i=0; i<n; i++)
            for(int j=0; j<m; j++)
                cin>>a[i][j];
        for(int i=0; i<n; i++)
            for(int j=0; j<m; j++)
            {
                if(a[i][j]=='S')
                {
                    f=i;
                    g=j;
                }
            }//记录起点的下标,从起点开始使用DFS函数
        DFS(f,g);
        if(flag)
            cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl;
    }
}

上一篇:1126:矩阵转置


下一篇:QNetworkAccessManager类详解