CDUTCM OJ 1126 走迷宫

本文介绍了一种使用深度优先搜索(DFS)算法解决迷宫问题的方法,通过递归地探索迷宫路径来判断是否存在从起点到终点的通路。

DFS深度优先搜索

题目描述

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

输入

多组测试数据,每组第一行两个正整数,分别为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

简单思路:直接从起点(S)开始上下左右遍历看是否找得到终点(T)
代码及简单注释:

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int MAX=11;//*路 #墙 S起点 T终点

char str[MAX][MAX];//定义我们的迷宫
int visit[MAX][MAX];//用来查看每一个点是否走过
int n,m;//迷宫的行与列
int flag;//用来判断是否找得到终点T,主函数初始化为0,找到改变值为1
int str_start,str_end;//用来存起始点坐标
//dfs遍历  传入起始点坐标
void dfs(int x,int y)
{
    if(x<0 || x>n-1 || y<0 || y>m-1) //如果坐标超界,跳出
    {
        return;
    }
    if(str[x][y]=='*') //遇到围墙,跳出
    {
        return;
    }
    if(str[x][y]=='T') //找到终点T,flag标记,跳出
    {
        flag=1;
        return;
    }
    if(visit[x][y]==1) //如果该点被访问过(走过),跳出
    {
        return;
    }
    visit[x][y]=1; //对该点标记,使其被访问
    dfs(x+1,y);//上下左右进行遍历,看是否有路可以走
    dfs(x,y+1);
    dfs(x-1,y);
    dfs(x,y-1);

}

int main()
{
    while(cin>>n>>m)
    {
        memset(visit,0,sizeof(visit));//初始化visit数组,使其所有值都为0,代表没有被访问
        flag=0;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                cin>>str[i][j];
            }
        }
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(str[i][j]=='S')//找到起始点的坐标
                {
                    str_start=i;
                    str_end=j;
                    goto end;//跳转到end处
                }
            }
        }
        end:;//end处
        dfs(str_start,str_end);//进行遍历
        if(flag==1)
        {
            cout<<"YES"<<endl;
        }
        else
        {
            cout<<"NO"<<endl;
        }
    }
    return 0;
}

先了解一下思路,再自己多打几遍,熟能生巧。
谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值