TZOJ 2777: Hero in Maze 简单版/深搜DFS

描述

 

500年前,Jesse是我国最卓越的剑客。他英俊潇洒,而且机智过人^_^。

突然有一天,Jesse心爱的公主被魔王困在了一个巨大的迷宫中。Jesse听说这个消息已经是两天以后了,他急忙赶到迷宫,开始到处寻找公主的下落。

请你判断他是否能救出心爱的公主。(假设有路可以通到公主那就可以找到公主)。

 

输入

 

题目包括多组测试数据。
每组测试数据以两个整数n,m(0<n, m≤20)开头,分别代表迷宫的长和高。紧接着有m行,n列字符,由".","*","P","S"组成。其中
"." 代表能够行走的空地。
"*" 代表墙壁,Jesse不能从此通过。
"P" 是公主所在的位置。
"S" 是Jesse的起始位置。
Jesse只能选择上、下、左、右任意一方向走一步。
输入以0 0结束。

 

输出

如果能救出公主输出YES,否则输出NO。

样例输入

 

4 4
....
....
....
S**P
4 4
....
....
****
S**P
0 0

样例输出

 

YES
NO

提示

输入0 0结束可以这样,
参考:
while(scanf("%d %d",&n,&m),m||n)
{

}

复制代码
#include<bits/stdc++.h>
using namespace std;
int n,m,f; //n行m列,f作为终点标记
int sx,sy,ex,ey;//起点终点坐标
int nex[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};//方向数组,右下左上
int vis[105][105]; //标记数组
char a[105][105]; //地图
void dfs(int x,int y); //声明dfs函数 
int main()
{
    while(cin>>m>>n) //多组数据输入
    {
        if(n==0&&m==0)break; //如果输入的n,m是0结束循环
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)//双重循环输入地图 
            {
                cin>>a[i][j]; //输入第i行第j列的字符
                if(a[i][j]=='S') //起点
                {
                    sx = i;sy = j;
                } 
                if(a[i][j]=='P') //终点 
                {
                    ex = i;ey = j;
                }
            } 
        memset(vis,0,sizeof(vis)); //初始化标记数组vis为0,表示整个地图没有走过
        f = 0; //初始化f
        dfs(sx,sy); //起点传入,开搜
        if(f==1) cout<<"YES"<<endl; //如果f执行完dfs为1,则找到了公主,输出yes 
        else cout<<"NO"<<endl; 
    } 
    return 0;
} 
void dfs(int x,int y)
{
    if(f==1)return; //如果f=1找到终点,直接返回程序 
    if(x==ex&&y==ey)
    {
        f = 1; //找到终点 
        return;
    }
    for(int i=0;i<4;i++) //循环4个方向
    {
        int tx = x + nex[i][0];
        int ty = y + nex[i][1]; //获取下一步的坐标tx,ty
        if(tx<1||tx>n||ty<1||ty>m)continue; //越界判断,判断tx,ty行列是否越界
        if(a[tx][ty]!='*' && vis[tx][ty]==0) //如果下一步不是*且vis数组没有标记过
        {
            vis[tx][ty] = 1; //vis数组标记1就证明该点走过
            dfs(tx,ty);//将tx,ty作为下一步的起点传入继续搜索 
        } 
    } 
} 
复制代码

 

posted @   CRt0729  阅读(65)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示