SDJZUOJ迷宫问题(BFS)
2016-03-11 10:29
281 查看
题目描述
小明置身于一个迷宫,请你帮小明找出从起点到终点的最短路程。小明只能向上下左右四个方向移动。
输入格式
输入包含多组测试数据。输入的第一行是一个整数T,表示有T组测试数据。每组输入的第一行是两个整数N和M(1<=N,M<=100)。
接下来N行,每行输入M个字符,每个字符表示迷宫中的一个小方格。
字符的含义如下:
‘S’:起点
‘E’:终点
‘-’:空地,可以通过
‘#’:障碍,无法通过
输入数据保证有且仅有一个起点和终点。
输出
对于每组输入,输出从起点到终点的最短路程,如果不存在从起点到终点的路,则输出-1。样例输入
15 5
S-###
-----
##---
E#---
---##
样例输出
9</pre><pre name="code" class="cpp">/* 1 5 5 S-### ----- ##--- E#--- ---## */ #include<stdio.h> #include<iostream> using namespace std; struct note { int x;//横坐标 int y;//纵坐标 int s;//走的步数 }; struct note que[2051]; char a[51][51]; int i,j,k,n,m,startx,starty,p,q,ty,tx,flag; int book[51][51]; int next[4][2]={{0,1}, {1,0}, {0,-1}, {-1,0}}; void bfs() { //队列初始化 int head=1; int tail=1; //往队列插入迷宫的入口坐标 que[tail].x=startx; que[tail].y=starty; que[tail].s=0; tail++; book[startx][starty]=1; flag=0;//用来标记是否到达目的地,0表示没有 while(head<tail)//当队列不为空时候 { //枚举四个方向(注意方向数组的设置和for循环的遍历,通用模板) for(k=0;k<=3;k++) { //计算下一个点坐标 tx=que[head].x+next[k][0]; ty=que[head].y+next[k][1]; //判断是否越界 if(tx<1||tx>n||ty<1||ty>n) continue; //判断是否是障碍物或者已经在路径中 if(a[tx][ty]!='#'&&book[tx][ty]==0)//此处不能写 a[tx][ty]=='-',因为这样起点就进不了队列中 { //把这个点标记为已经走过 //注意宽带搜索每个点只能入队列一次 ,和dfs不同,所以book的值不需要恢复为0; book[tx][ty]=1; //插入新的点到队列中 que[tail].x =tx; que[tail].y=ty; que[tail].s=que[head].s+1; tail++; } //如果到了目的地,停止扩展,任务结束,退出循环 if(tx==p&&ty==q) { //注意这两句话千万位置不能颠倒 flag=1; break; } } if(flag==1) break; head++;//这个地方千万不能忘记,当一个点扩展结束后,head++才能使得后面的点再进行扩展 } //打印队列中末尾最后一个点的步数 //注意tail是指向队尾的下一个位置,所以需要-1 cout<<que[tail-1].s; } int main() { cin>>n>>m; for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { cin>>a[i][j]; if(a[i][j]=='S') { startx=i; starty=j; } if(a[i][j]=='E') { p=i; q=j; } } } bfs(); return 0; }
相关文章推荐
- 怎么在火狐浏览器查看保存的cookie
- 关掉D6 CPU调试窗口
- Android深入浅出系列之Socket—Socket编程(二)
- git 常用命令
- js字符串操作
- python中enumerate函数遍历元素用法分析
- main执行前后
- 继承fragment 与 fragmentactivity的区别
- Qt中屏蔽警告和调试信息
- Android N分屏模式Activity生命周期的变化
- [转]CSS 表单元素对齐详解
- PS新手教程!教你绘制一枚通透质感的游戏按钮
- UEditor 1.4.3版本中去掉本地保存功能
- C++第一次上机实验-1
- base64(Bitmap和base64的互换)
- 华为oj 字符串个数统计&&数字颠倒&&字符串翻转&&字符逆序&&求int型数据在内存中存储时1的个数
- linux里的backlog详解
- transitionFromViewController使用
- Android项目开发(4)-忘记密码---验证码验证页面功能实现
- 【bzoj2258】【文本校对】【splay+hash】