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 }
原文地址:https://www.cnblogs.com/weedboy/p/7082209.html