36.迷宫(广度优先搜索)
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 黄金 Gold
题解
题目描述 Description
在N*N的迷宫内,“#”为墙,“.”为路,“s”为起点,“e”为终点,一共4个方向可以走。从左上角((0,0)“s”)位置处走到右下角((n-1,n-1)“e”)位置处,可以走通则输出YES,不可以走则输出NO。
输入描述 Input Description
输入的第一行为一个整数m,表示迷宫的数量。
其后每个迷宫数据的第一行为一个整数n(n≤16),表示迷宫的边长,接下来的n行每行n个字符,字符之间没有空格分隔。
输出描述 Output Description
输出有m行,每行对应的迷宫能走,则输出YES,否则输出NO。
样例输入 Sample Input
1
7
s...##.
.#.....
.......
..#....
..#...#
###...#
......e
样例输出 Sample Output
YES
代码:
(使用递归回溯)超时程序:
#include
using namespace std;
#include
#include
int m,p[17][17];
int xx[4]={1,-1,0,0};
int yy[4]={0,0,1,-1};int flag;
void search(int xq,int yq,int xz,int yz,int n)
{
if(xq==xz&&yq==yz)
{
flag=1;
return;
}
for(int i=0;i<=3;++i)
{
int x1=xq+xx[i],y1=yq+yy[i];
if(x1>=1&&x1<=n&&y1>=1&&y1<=n&&p[x1][y1]==0)
{
p[x1][y1]=1;
search(x1,y1,xz,yz,n);
p[x1][y1]=0;
if(flag==1)
return;
}
}
}
int main()
{
scanf("%d",&m);
for(int i=1;i<=m;++i)
{
int n,xq,yq,xz,yz;
scanf("%d",&n);
flag=0;
char bz[17];
memset(p,0,sizeof(p));
for(int j=1;j<=n;++j)
{
scanf("%s",bz+1);
for(int l=1;l<=n;++l)
{
if(bz[l]=='#')
p[j][l]=1;
if(bz[l]=='.')
p[j][l]=0;
if(bz[l]=='s')
{
p[j][l]=0;
xq=l;yq=j;
}
if(bz[l]=='e')
{
p[j][l]=0;
xz=l;
yz=j;
}
}
}
search(xq,yq,xz,yz,n);
if(flag==1)
printf("YES\n");
else printf("NO\n");
}
return 0;
}
AC程序:(广搜加队列):
#include
using namespace std;
#include
#include
int d[17*17][2]={0},head,tail,mg[17][17]={0};
int xx[]={0,0,1,-1};
int yy[]={1,-1,0,0},m;
int search(int n,int xz,int yz)
{
head=0;tail=1;
memset(d,0,sizeof(d));
d[tail][0]=1;d[tail][1]=1;
mg[1][1]=1;
while(head
{
++head;
int x1=d[head][0],y1=d[head][1];
if(x1==xz&&y1==yz)
return 1;
for(int i=0;i<=3;++i)
{
int x=x1+xx[i],y=y1+yy[i];
if(x>=1&&x<=n&&y>=1&&y<=n&&mg[x][y]==0)
{
++tail;
d[tail][0]=x;
d[tail][1]=y;
mg[x][y]=1;
}
}
}
return 0;
}
void input()
{
char p[17];
scanf("%d",&m);
int xq=1,xz,n,yq=1,yz;
mg[1][1]=1;
for(int i=1;i<=m;++i)
{
scanf("%d",&n);
xz=n;yz=n;
for(int l=1;l<=n;++l)
{
scanf("%s",p+1);
for(int j=1;j<=n;++j)
{
if(p[j]=='#')
mg[l][j]=1;
}
}
int flag=search(n,xz,yz);
if(flag==1) printf("YES\n");
else printf("NO\n");
}
}
int main()
{
input();
return 0;
}
转载于:https://www.cnblogs.com/csgc0131123/p/5290451.html
36.迷宫(广度优先搜索)相关推荐
- 广度优先搜索解决欧拉回路时间复杂度_迷宫搜索类的双向bfs问题(例题详解)
前言 文章若有疏忽还请指正! 更多精彩还请关注公众号:bigsai 头条号:一直码农一直爽 在搜索问题中,以迷宫问题最具有代表性,无论是八皇后的回溯问题,还是dfs找出口,bfs找最短次数等等题目的问 ...
- 广度优先算法_算法浅谈——走迷宫问题与广度优先搜索
本文始发于个人公众号:TechFlow,原创不易,求个关注 在之前周末LeetCode专栏当中,我们详细描述了深度优先搜索和回溯法,所以今天我们继续这个话题,来和大家聊聊搜索算法的另一个分支,广度优先 ...
- 广度优先搜索:迷宫问题
用广度优先搜索解决迷宫问题是一个比较基础的方法.由于自己在算法方面基础不是很好,并没有达到能随手就写出BFS的水平,所以花了点时间写了一个BFS来解决比较基础的迷宫问题,权当练习,并供自己以后参考. ...
- 迷宫问题 深度优先搜索 广度优先搜索 宽度优先搜索【python】
文章目录 一.实验内容 二.深度优先搜索和广度优先搜索总结 1.深度优先搜索算法 2.广度优先搜索算法 三.实验代码和用于测试的迷宫 1.实验代码 2.测试迷宫 2.1 maze1.txt 2.2 m ...
- 广度优先搜索 宽度优先搜索 迷宫问题 最短路径 最少操作 由近及远 队列
广度优先搜索,也叫宽度优先搜索,从开始状态,到第一次能到达的状态,再从第一次能到达的状态到下一个能到达的状态,直到探索所有可到达的状态,其时间复杂度为O(状态数×转移的方式). 广度优先搜索使用了队列 ...
- 深度优先搜索和广度优先搜索及典例分析(走迷宫问题(BFS)和棋盘问题(DFS))
搜索算法在实际编程应用中起着举足轻重的作用,学会掌握搜索算法并熟练应用搜索算法来解决实际问题不得不说是一件相当COOL的事,所以我将深度搜索和广度搜索认真地做了详细的总结,与诸君共勉,也方便以后查阅复 ...
- 迷宫问题:深度优先搜索和广度优先搜索
迷宫问题:深度优先搜索和广度优先搜索 1.深度优先搜索可以使用栈实现,栈顶元素为当前节点 2.当前节点搜索下一节点,判断节点是否走得通,如果走得通任意方向走一步,走不通一直弹出栈内元素,直到走得通 3 ...
- 广度优先搜索(BFS)
广度优先 Description: 阿狸被困在迷宫,snoopy要去救他,snoopy可以向上.下.左.右四个方向行走,每走一步(格)就要喝掉一瓶益力多.现在给它一个迷宫地图请问:snoopy最少需要 ...
- 步步为营(十六)搜索(二)BFS 广度优先搜索
上一篇讲了DFS,那么与之相应的就是BFS.也就是 宽度优先遍历,又称广度优先搜索算法. 首先,让我们回顾一下什么是"深度": 更学术点的说法,能够看做"单位距离下,离起 ...
- LQ训练营(C++)学习笔记_广度优先搜索
这里写目录标题 四.广度优先搜索 1.队列的概念 2.小朋友报数问题 2.1 问题描述 2.2 代码实现 3.广度优先搜索概念 4.走迷宫问题 4.1 问题描述 4.2 代码实现 5.过河卒问题 5. ...
最新文章
- win10怎么设置开机启动项目_苹果mac开机启动项怎么设置
- NodeJS、NPM安装配置步骤(windows版本)
- linux 定时任务 crontab服务 启动 停止 重启
- set,env和export命令显示shell变量其区别,与环境变量扫盲(一)
- 百词斩和扇贝打卡测试与评估
- Python从键盘输入多行文本数据的方法
- java8 lambda map排序_Java8新特性第3章(Stream API)
- mysql 硬盘缓存_paip.mysql性能跟iops的以及硬盘缓存的关系_MySQL
- 怎么看b树是几阶_数据库原理基础:设计B树与B+树的目的以及二者的优劣
- 二分搜索:lower_bound 与 upper_bound 函数
- Broadcast variabies-广播变量
- 关于JavaScript中变量的相互引用
- 23_Shell语言————位置变量($@、$、$#、shift)
- cms php套件,PHPCMS服务器套件(Pc_webserver)
- 如何重置IE浏览器?重置IE浏览器的方法
- 抖音高贵气质的签名_最新抖音气质个性签名 简短唯美幸福个性签名
- 服务器基础知识大科普
- 新增业务订单设计——产品形态随想
- 0基础能学“软件测试”吗?好学吗?怎么学?
- C语言编程>第一周 ⑧ 输入两个正整数m和n,求其最大公约数和最小公倍数。
热门文章
- GoldenGate 配置extract,replicat进程自启动
- jQuery Alert Dialogs (Alert, Confirm, Prompt Replacements)(翻译)
- Delphi 2010 新增功能之: IOUtils 单元(4): TDirectory.GetDirectories
- stm32断言的使用
- 连接数据库时常用的工具类(一)-------C3P0XmlUtils
- web移动端全屏滚动页面的适配问题
- [SCOI2010]股票交易
- Nodejs的express使用教程
- VB6 XArrayDB | Xarray ReDim 用法
- 【错误记录】无法打开 “xxx“ , 因为 Apple 无法检查其是否包含恶意软件