HDU1728 逃离迷宫 BFS
来源:互联网 发布:淘宝邀请的活动好不好 编辑:程序博客网 时间:2024/05/21 17:35
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1728
逃离迷宫
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 27250 Accepted Submission(s): 6658
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
#include <iostream>#include <cstring>#include <queue>using namespace std;typedef pair<int, int> P;typedef pair<pair<int, int>, int> Pair;// pair((横坐标x, 纵坐标y), 转弯次数k) ——转弯次数初值为题目给定,每转弯一次,k就减一,当k减为负时就该退出bfs了const int MAXN = 107;const int INF = 0x7FFFFFFF;char maze[MAXN][MAXN];//标记该位置是否被访问bool vis[MAXN][MAXN];//转弯次数,起点横坐标,起点纵坐标,终点横坐标,终点纵坐标int k, start_x, start_y, end_x, end_y;int d[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};void bfs(int m, int n){ queue<Pair> q; q.push(Pair(P(start_x - 1, start_y - 1), k)); vis[start_x - 1][start_y - 1] = true; while(!q.empty()){ Pair top = q.front(); q.pop(); //如果转弯次数超过限制就break(期间队头可能不是终点,但终点一定包含在队列里面) if(top.second < 0) break; for(int i = 0; i < 4; i++){ int nx = top.first.first + d[i][0], ny = top.first.second + d[i][1]; //不撞南墙不回头! while(0 <= nx && nx < m && 0 <= ny && ny < n && maze[nx][ny] == '.'){ if(!vis[nx][ny]){ vis[nx][ny] = true; q.push(Pair(P(nx, ny), top.second - 1)); } //一直向前 nx += d[i][0], ny += + d[i][1]; } } }}int main(){ cin.tie(0); cout.tie(0); int T; cin >> T; while(T--){ int m, n; cin >> m >> n; memset(vis, 0, sizeof(vis)); for(int i = 0; i < m; i++) for(int j = 0; j < n; j++) cin >> maze[i][j]; cin >> k >> start_y >> start_x >> end_y >> end_x; bfs(m, n); cout << (vis[end_x - 1][end_y - 1] ? "yes" : "no") << endl; }}
阅读全文
0 0
- hdu1728 逃离迷宫(bfs)
- HDU1728:逃离迷宫(BFS)
- hdu1728逃离迷宫(bfs)
- HDU1728:逃离迷宫(BFS)
- HDU1728 逃离迷宫 BFS
- hdu1728 逃离迷宫 bfs
- HDU1728 逃离迷宫 【BFS】
- HDU1728 逃离迷宫【BFS】
- hdu1728逃离迷宫 bfs
- HDU1728:逃离迷宫【BFS】
- HDU1728 逃离迷宫(BFS)
- HDU1728 逃离迷宫BFS
- hdu1728 逃离迷宫--BFS
- hdu1728 逃离迷宫 --bfs
- HDU1728 逃离迷宫 BFS
- HDU1728逃离迷宫(BFS)
- hdu1728逃离迷宫(水bfs)
- HDU1728 逃离迷宫 【方向BFS】
- hud神,上帝及老天爷
- 匆匆结束的大学两年
- Codeforces 821D Okabe and City (拆点+思维建图+spfa)
- 编程题--最长公共子序列
- eclipse导入SVN上的Maven多模块项目
- HDU1728 逃离迷宫 BFS
- 虚拟机类初始化机制
- Android 仿iphone提醒事项(三)
- 区别多态和重载
- ffmpeg视频分割,视频合成
- BZOJ 1458: 士兵占领 最大流 题解
- 用JavaScript来实现队列
- Windows系统添加环境变量方法
- Python的注释