一本通:1215
哈喽啊!这是我的第一篇题解,在我12岁生日的22:02时写完了!!(o)/~
谢谢你能点开我的价值千金 一文不值的题解(๑′ᴗ‵๑)
蒟蒻不才,还望大佬多多指教 ……
(此处省略∞字)
点击看题目
—————————————————————————
一. 题目分析
-
题意:在n*n的迷宫里,“.”为可走,“#”为不可走,问:是否可以从点A走到点B。
-
输入:先输入迷宫,在输入4个数,前两个为点A的坐标,后两个为点B的坐标。
-
输出:可以走到输出“YES”,反之输出“NO”。
二.思路整合
十分典型的一道迷宫题,我选用了广搜(宽搜)的算法。
但我神奇的没有用bfs函数。
-
定义:除了要求输入的变量外,我们需要一个bool类型的 二维数组v,来负责标记是否访问过;两个一维数组,dx[4]={0,1,0,-1},dy[4]={1,0,-1,0}, 按照右下左上的顺序,方便我们访问。
-
输入:首先输出入组数。接着,开始一个while循环,这里注意:在进行下面的输入之前,一定要将数组与队列清零!!这一点非常重要!
接着,按照题意继续输入就可以了。 -
访问:按照顺序我们给定的顺序,开始访问相邻点,看是否“合法”。不合法的话,就终止访问;如果合法,就将这个点加入队列,标记为访问。
(合法条件:① 不碰壁,即不为“#”。②没有被访问过。)
三.代码呈现
#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