您的位置:首页 > 其它

HDU 1728 逃离迷宫【BFS】

2017-12-17 13:40 351 查看
逃离迷宫

Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 30115 Accepted Submission(s): 7393

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对应行。

Output

  每组测试数据对应为一行,若gloria能从一个位置走到另外一个位置,输出“yes”,否则输出“no”。

Sample Input

2

5 5

…**

.*.

…..

…..

*….

1 1 1 1 3

5 5

…**

.*.

…..

…..

*….

2 1 1 1 3

Sample Output

no

yes

Source

“网新恩普杯”杭州电子科技大学程序设计邀请赛

Recommend

lcy | We have carefully selected several similar problems for you: 1253 1175 1072 1026 1372

大一的时候被卡住的一道题

分析:从表面来看问题的关键是如何确定转弯方向,这个好说,标记好当前状态,现在状态。不是同一方向就+1,然后呢用优先队列来维护。k的取值范围不大,或许能解决。

如果没有优先队列,却又要维护最优解,为之奈何?

处理每一个点的时候,都把和其方向相同的点全部处理,这样就保证已经标记过的点肯定是最优!

#include<iostream>
#include<queue>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
struct node {
int x, y;
int to;
int step;
};
int dx[4] = { 0,0,1,-1 };
int dy[4] = { 1,-1,0,0 };
node st, ed;
int m, n, k;
char mp[105][105];
int vis[105][105];
void bfs()
{
bool flag = 0;
queue<node> q;
st.step = -1;
st.to = 0;
q.push(st);
vis[st.x][st.y] = 1;
while (!q.empty())
{
node nw = q.front();
//cout << nw.x << " " << nw.y << " " << nw.to << " " << nw.step << endl;
q.pop();
if (nw.x == ed.x&&nw.y == ed.y&&nw.step <= k) {
flag = 1; break;
}
//if (nw.step > k) break;
node tmp;
for (int i = 0; i < 4; i++) {
tmp.x = nw.x + dx[i];
tmp.y = nw.y + dy[i];
node cs;
while (tmp.x >= 0 && tmp.x < m&&tmp.y >= 0 && tmp.y < n&&mp[tmp.x][tmp.y] != '*') {
if (vis[tmp.x][tmp.y] == 0)
{
tmp.step = nw.step + 1;
vis[tmp.x][tmp.y] = 1;
q.push(tmp);
}
cs.x = tmp.x + dx[i];
cs.y = tmp.y + dy[i];
tmp = cs;
}
}
}
if (flag)
printf("yes\n");
else
printf("no\n");
}
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
memset(vis, 0, sizeof vis);
scanf("%d %d", &m, &n);
for (int i
4000
= 0; i < m; i++) {
scanf("%s", mp[i]);
}
scanf("%d %d %d %d %d", &k, &st.y, &st.x, &ed.y, &ed.x);
st.x--; st.y--; ed.x--; ed.y--;
bfs();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: