hdu 1728 逃离迷宫(BFS 有 限制条件,陷阱比较多)
来源:互联网 发布:看耽美的软件 编辑:程序博客网 时间:2024/06/05 17:53
1、http://acm.hdu.edu.cn/showproblem.php?pid=1728
2、题目:
逃离迷宫
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 11191 Accepted Submission(s): 2671
Problem Description
给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位置,只能走到与它相邻的4个位置中,当然在行走过程中,gloria不能走到迷宫外面去。令人头痛的是,gloria是个没什么方向感的人,因此,她在行走过程中,不能转太多弯了,否则她会晕倒的。我们假定给定的两个位置都是空地,初始时,gloria所面向的方向未定,她可以选择4个方向的任何一个出发,而不算成一次转弯。gloria能从一个位置走到另外一个位置吗?
Input
第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对应行。
第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对应行。
Output
每组测试数据对应为一行,若gloria能从一个位置走到另外一个位置,输出“yes”,否则输出“no”。
Sample Input
25 5...***.**...........*....1 1 1 1 35 5...***.**...........*....2 1 1 1 3
Sample Output
noyes
3、代码:
//hdu 1728#include<stdio.h>#include<string.h>#define N 105#include<iostream>using namespace std;char map[N][N];int visit[105][105];int sx,sy,ex,ey,n,m;int dir[4][2]={0,1,0,-1,-1,0,1,0};struct node{ int dir;//记录来的方向1234分别表示上下左右 int x; int y; int step;//拐的弯数}a[1000005];int find(int i){ if(i==0) return 1; else if(i==1) return 2; else if(i==2) return 3; else if(i==3) return 4;}int bfs(int k){ //memset(visit,0,sizeof(visit));for(int i=0;i<=m;i++)for(int j=0;j<=n;j++)visit[i][j]=100005;//错在最大值赋值小了 a[0].x=sx; a[0].y=sy; a[0].dir=-1; a[0].step=0; visit[sx][sy]=0; int start=0,end=1; node cur,change; while(start<end) { cur=a[start++];//printf("***%d %d %d\n",cur.x,cur.y,cur.step); if(cur.x==ex && cur.y==ey && cur.step<=k+1) return 1; for(int i=0;i<4;i++) { int tx=cur.x+dir[i][0]; int ty=cur.y+dir[i][1]; if(tx>0 && tx<=m && ty>0 && ty<=n && map[tx][ty]!='*') { change.x=tx; change.y=ty; change.dir=find(i);//printf("&&&%d %d %d\n",change.x,change.y,change.dir); if(change.dir!=cur.dir) change.step=cur.step+1; else change.step=cur.step;if(change.step<=visit[tx][ty] && change.step<=k+1) {a[end++]=change;visit[tx][ty]=change.step;} } } } return 0;}int main(){ int t,k; cin>>t; while(t--) { cin>>m>>n; for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) cin>>map[i][j]; } cin>>k>>sy>>sx>>ey>>ex; if(bfs(k)) printf("yes\n"); else printf("no\n"); } return 0;}
- hdu 1728 逃离迷宫(BFS 有 限制条件,陷阱比较多)
- HDU 1728 逃离迷宫 转向限制BFS
- HDU 1728 逃离迷宫 bfs 限制k次转弯
- HDU 1728 逃离迷宫(BFS)
- hdu 1728 逃离迷宫(BFS)
- hdu 1728 逃离迷宫(bfs)
- HDU 1728 逃离迷宫(BFS)
- hdu 1728 逃离迷宫(BFS)
- hdu 1728 逃离迷宫(BFS)
- HDU 1728 逃离迷宫(BFS)
- HDU 1728 逃离迷宫(BFS+DFS)
- HDU 1728 逃离迷宫 (BFS)
- hdu 1728 逃离迷宫(BFS)
- HDU 1728 逃离迷宫(BFS)
- bfs hdu 1728 逃离迷宫
- hdu 1728 逃离迷宫 (BFS)
- hdu 1728 逃离迷宫 BFS
- HDU 1728 逃离迷宫 BFS
- jsp连接MySQL数据库显示GIS地理数据乱码问题的解决(select AsText(the_geom))
- ural 1306(堆-优先级序列)
- hdu 分类
- struts2工作原理
- Web服务器:IIS 7 应用程序池自动回收关闭的解决方案
- hdu 1728 逃离迷宫(BFS 有 限制条件,陷阱比较多)
- Hibernate的clear(),flush(),evict()方法详解
- OCI连接池
- android 禁用锁屏 到修改方式
- ARM状态寄存器 CPSR SPSR
- UVA 10131 - Is Bigger Smarter? (动态规划)
- 去掉UITableView的header和footer的黏性效果
- Delphi 串口通信(1)
- ascii160 和 ascii32 的区别