一本通:1215

一本通:1215

哈喽啊!这是我的第一篇题解,在我12岁生日的22:02时写完了!!(o)/~
谢谢你能点开我的价值千金 一文不值的题解(๑′ᴗ‵๑)

蒟蒻不才,还望大佬多多指教 ……

(此处省略∞字)
点击看题目
—————————————————————————

一. 题目分析

  • 题意:在n*n的迷宫里,“.”为可走,“#”为不可走,问:是否可以从点A走到点B。

  • 输入:先输入迷宫,在输入4个数,前两个为点A的坐标,后两个为点B的坐标。

  • 输出:可以走到输出“YES”,反之输出“NO”。

二.思路整合

十分典型的一道迷宫题,我选用了广搜(宽搜)的算法。

但我神奇的没有用bfs函数。

  1. 定义:除了要求输入的变量外,我们需要一个bool类型的 二维数组v,来负责标记是否访问过;两个一维数组,dx[4]={0,1,0,-1},dy[4]={1,0,-1,0}, 按照右下左上的顺序,方便我们访问。

  2. 输入:首先输出入组数。接着,开始一个while循环,这里注意:在进行下面的输入之前,一定要将数组与队列清零!!这一点非常重要!
    接着,按照题意继续输入就可以了。

  3. 访问:按照顺序我们给定的顺序,开始访问相邻点,看是否“合法”。不合法的话,就终止访问;如果合法,就将这个点加入队列,标记为访问。

(合法条件:① 不碰壁,即不为“#”。②没有被访问过。)

三.代码呈现

#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
int n,p,q,nn,dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};//右下左上的顺序 
char c[200][200];//迷宫 
bool v[200][200];//标记是否访问过 
struct point{
    int x,y;
}start;
queue<point> r;
int main(){ 
    scanf("%d",&nn);//输入组数 
    while(nn--){
        memset(v,0,sizeof(v));//将数组清零,初始化 
        while(!r.empty()) r.pop();//清空队列 
        scanf("%d",&n);//输入规模 
        for(int i=0;i<n;i++) 
            scanf("%s",&c[i]);//输入地图 
        scanf("%d %d %d %d",&start.x,&start.y,&p,&q);//输入起始坐标与终点坐标 
        r.push(start);//将起始数加入队列 
        v[start.x][start.y]=1; //将起始设为已访问 
        while(!r.empty()){//如果队列非空 
            int x=r.front().x,y=r.front().y;//记录此时坐标 
            if(x==p&&y==q){//如果此时坐标就是终点坐标 
                printf("YES\n");//输出并退出 
                break;
            }
            for(int k=0;k<4;k++){//开始访问相邻点 
                int tx=x+dx[k],ty=y+dy[k];//记录此点 
                if(v[tx][ty]==1||c[tx][ty]!='.') //如果不符合要求,就结束此次访问 
                    continue;
                r.push((point){tx,ty});//将此点加入队列 
                v[tx][ty]=1;//设为已访问 
            }
            r.pop();//弹出 
        } 
        if(r.empty()) //如果队列空了,还没有"走出"迷宫,说明不可以,那么就输出"NO"
            printf("NO\n");
        for(int i=0;i<n;i++)//清空字符数组 
            for(int j=0;j<n;j++) 
                c[i][j]=' ';
    }
    return 0;
}

蒟蒻的第一篇题解,如果有错,大佬麻烦私聊通知
Thanks♪(・ω・)ノ

十分感谢你有耐心读完我的题解
点个赞支持一下吧(〃‘▽’〃)

ヾ( ̄▽ ̄)ByeBye

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值