hihocoder 1519 : 逃离迷宫II

题目链接

时间限制:10000ms

单点时限:1000ms

内存限制:256MB

描述

小Hi被坏女巫抓进里一间有N x M个格子组成的矩阵迷宫。

有些格子是小Hi可以经过的,我们用‘.‘表示;有些格子上有障碍物小Hi不能经过,我们用‘#‘表示。小Hi的起始位置用‘S‘表示,他需要到达用‘T‘表示的格子才能逃离迷宫。

麻烦的是小Hi被坏女巫施了魔法,他只能选择上下左右某一个方向,沿着这个方向一直走,直到遇到障碍物或者迷宫边界才能改变方向。新的方向可以是上下左右四个方向之一。之后他还是只能沿着新的方向一直走直到再次遇到障碍物或者迷宫边界……

小Hi想知道他最少改变几次方向才能逃离这个迷宫。

输入

第一行包含两个整数N和M。  (1 <= N, M <= 500)

以下N行每行M个字符,代表迷宫。

输出

一个整数代表答案。如果小Hi没法逃离迷宫,输出-1。

样例输入
5 5
S.#.T
.....
.....
.....
.....
样例输出
2

题目有个地方感觉很坑,就是没有真正告诉过你路过也可以算到达终点,反而题目中 “直到遇到障碍物或者迷宫边界才能改变方向” 误导性可以说是非常坏坏了。BFS。

ac代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<vector>
 5 #include<set>
 6 #include<algorithm>
 7 #include<queue>
 8
 9 using namespace std;
10
11 const int maxn = 505;
12 char map[maxn][maxn];
13 bool visit[maxn][maxn];
14 int dir[4][2] = { 0,1,0,-1,1,0,-1,0 };
15 int res;
16 int n, m;
17
18 struct node {
19     int i;
20     int j;
21     int cnt;
22     node(){}
23     node(int ii, int jj, int c) : i(ii), j(jj), cnt(c) {};
24 };
25 queue<node> q;
26 int findway(node s)        //bfs
27 {
28     visit[s.i][s.j] = true;
29     q.push(s);
30
31     while (!q.empty())
32     {
33         node f = q.front();
34         q.pop();
35
36         for (int i = 0; i < 4; i++) {
37             int nexti = f.i + dir[i][0];
38             int nextj = f.j + dir[i][1];
39
40             while (map[nexti][nextj] != ‘#‘&&nexti >= 0 && nexti < n&&nextj >= 0 && nextj < m)
41             {
42                 if (map[nexti][nextj] == ‘T‘)
43                     return f.cnt+1;
44                 nexti += dir[i][0];
45                 nextj += dir[i][1];
46             }
47             nexti -= dir[i][0];
48             nextj -= dir[i][1];
49             if (visit[nexti][nextj] == false)
50             {
51                 node nextnode = node(nexti, nextj, f.cnt + 1);
52                 visit[nexti][nextj] = true;
53                 q.push(nextnode);
54             }
55         }
56     }
57     return -1;
58 }
59
60 int main()
61 {
62     memset(map, ‘0‘, sizeof(map));
63     memset(visit, false, sizeof(visit));
64     cin >> n >> m;
65     node s;
66     int si, sj;
67     for (int i = 0;i < n;i++)
68         for (int j = 0;j < m;j++) {
69             cin >> map[i][j];
70             if (map[i][j] == ‘S‘)
71             {
72                 visit[i][j] = true;
73                 s.i = i;
74                 s.j = j;
75                 s.cnt = -1;
76             }
77         }
78     cout << findway(s) << endl;
79     return 0;
80 }
时间: 2024-08-06 07:57:42

hihocoder 1519 : 逃离迷宫II的相关文章

HDU 1728 逃离迷宫(DFS经典题,比赛手残写废题)

逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 27185    Accepted Submission(s): 6630 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方

(hdu step 4.2.7)逃离迷宫(在有转弯次数的限制的情况下,判断一个点是否能到另一个点)

题目: 逃离迷宫 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 264 Accepted Submission(s): 85   Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍

(╭ ̄3 ̄)╭ 小希的迷宫II

(╭ ̄3 ̄)╭ 小希的迷宫II TimeLimit: 2000/1000 MS (Java/Others)  MenoryLimit: 65536/32768 K (Java/Others) 64-bit integer IO format:%I64d Problem Description 上次Gardon的迷宫城堡小希玩了很久,现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是单向连通的,就是说如果有一个通道连通了房间A和B,那么它只能从房间A

HDU 1728 逃离迷宫(DFS||BFS)

逃离迷宫 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位置,只能走到与它相邻的4个位置中,当然在行走过程中,gloria不能走到迷宫外面去.令人头痛的是,gloria是个没什么方向感的人,因此,她在行走过程中,不能转太多弯了,否则她会晕倒的.我们假定给定的两个位置都是空地,初始时,gloria所面向的方向

逃离迷宫(HDU 1728 BFS)

逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 21384    Accepted Submission(s): 5180 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方

hdu 1728 逃离迷宫 (BFS)

逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 14376    Accepted Submission(s): 3458 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方

HDU1728 逃离迷宫 【BFS】

逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 16840    Accepted Submission(s): 4108 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地

hdu 1728 逃离迷宫 bfs记转向

题链: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): 18702    Accepted Submission(s): 4526 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,g

HDU 1728 逃离迷宫

这道题做的我想哭啊..WA了将近十次了吧 一开始我用数组模拟的队列,后来和老大代码对拍,感觉改的是基本都一模一样了,还是WA 实在没有办法了,改用queue了 题目里的x是列y是行,和代码里的反过来的,要注意! 题目里面说在起点的时候无论朝哪个方向走都不算一次转弯,所以我们将方向和转弯次数都赋值为-1,这样就不用特殊处理了 入队条件,拓展后的转弯次数小于或等于vis数组中记录的最小转弯次数即可入队 输出结果,不要一搜到终点便急着输出,应为可能后面再一次搜到终点的时候转弯次数小于k 因此可以遍历完