逃离迷宫(HDU 1728 BFS)
2016-03-21 20:53
302 查看
逃离迷宫
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 21384 Accepted Submission(s): 5180
[align=left]Problem Description[/align]
给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位置,只能走到与它相邻的4个位置中,当然在行走过程中,gloria不能走到迷宫外面去。令人头痛的是,gloria是个没什么方向感的人,因此,她在行走过程中,不能转太多弯了,否则她会晕倒的。我们假定给定的两个位置都是空地,初始时,gloria所面向的方向未定,她可以选择4个方向的任何一个出发,而不算成一次转弯。gloria能从一个位置走到另外一个位置吗?
[align=left]Input[/align]
第1行为一个整数t (1 ≤ t ≤ 100),表示测试数据的个数,接下来为t组测试数据,每组测试数据中,
第1行为两个整数m, n (1 ≤ m, n ≤ 100),分别表示迷宫的行数和列数,接下来m行,每行包括n个字符,其中字符'.'表示该位置为空地,字符'*'表示该位置为障碍,输入数据中只有这两种字符,每组测试数据的最后一行为5个整数k, x1, y1, x2, y2 (1 ≤ k ≤ 10, 1 ≤ x1, x2 ≤ n, 1 ≤ y1, y2 ≤ m),其中k表示gloria最多能转的弯数,(x1, y1), (x2, y2)表示两个位置,其中x1,x2对应列,y1, y2对应行。
[align=left]Output[/align]
每组测试数据对应为一行,若gloria能从一个位置走到另外一个位置,输出“yes”,否则输出“no”。
[align=left]Sample Input[/align]
2
5 5
...**
*.**.
.....
.....
*....
1 1 1 1 3
5 5
...**
*.**.
.....
.....
*....
2 1 1 1 3
[align=left]Sample Output[/align]
no
yes
#include <algorithm> #include <cstring> #include <cstdio> #include <iostream> #include <queue> using namespace std; int dx[]={0,0,-1,1},dy[]={1,-1,0,0}; char map[102][102]; int ans[102][102]; int m,n,k; int x01,x02,y01,y02; struct node { int x,y; int dix,diy; int num; }; bool bfs() { int i,j; queue<node> Q; node p,u; p.x=y01,p.y=x01; p.num=-1; p.dix=p.diy=-1; Q.push(p); while(!Q.empty()) { p=Q.front(); Q.pop(); if(p.num>ans[p.x][p.y]||p.num>k) continue; else ans[p.x][p.y]=p.num; if(p.x==y02&&p.y==x02) return 1; for(i=0;i<4;i++) { u.x=p.x+dx[i]; u.y=p.y+dy[i]; u.dix=dx[i],u.diy=dy[i]; u.num=p.num+1; if(u.x<1||u.y<1||u.x>m||u.y>n||map[u.x][u.y]=='*') continue; if(dx[i]==p.dix&&dy[i]==p.diy) { u.num--; Q.push(u); } else Q.push(u); } } return 0; } int main() { int t,i,j; freopen("in.txt","r",stdin); scanf("%d",&t); while(t--) { scanf("%d%d",&m,&n); getchar(); for(i=1;i<=m;i++) { for(j=1;j<=n;j++) scanf("%c",&map[i][j]); getchar(); } scanf("%d%d%d%d%d",&k,&x01,&y01,&x02,&y02); for(i=1;i<=m;i++) for(j=1;j<=n;j++) ans[i][j]=15; if(bfs()) printf("yes\n"); else printf("no\n"); } return 0; }
相关文章推荐
- 作业三(上)阅读程序
- 一些网站的推荐(长期更新)
- n个人循环报数1-3问题
- 构造方法与重载
- Java 进阶 之 并发编程 Synchronized
- 54. Spiral Matrix
- [Poj 3278] Catch That Cow BFS
- PopupWindow和AlertDialog区别
- Android下pm 命令详解
- 第三周对构建之法的理解
- 【分享】图解Windows Server 2012 R2 配置IIS 8全过程
- Struts2工作原理
- 蓝牙、红外线与wifi 区别以及不同频段无线电磁波的穿墙和绕过障碍物能力(转)
- 【一张大大的图片】类和对象知识点总结
- /sys/power创建
- Android launcher3 开发初始篇
- 单元测试
- 基于8051内核的实验—流水灯
- iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式
- ZOJ 1100 Mondriaan's Dream【状态压缩】【DP】【DFS】