UESTC 149 解救小Q

简单 有意思的迷宫问题

主要看平时标记的习惯吧。。 一开始就跪了,多亏迪哥给了组数据。。

5 5
....L
.###a
a#...
##.##
...Q.

answer

9

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstdlib>
  4 #include<cstring>
  5 #include<string>
  6 #include<queue>
  7 #include<algorithm>
  8 #include<map>
  9 #include<iomanip>
 10 #include<climits>
 11 #include<string.h>
 12 #include<stdlib.h>
 13 #define INF 1e11
 14 #define MAXN 60
 15 using namespace std;
 16 
 17 struct node {
 18     int x1, y1;
 19     int x2, y2;
 20     bool ok;
 21 }a[30];
 22 
 23 struct dir{
 24     int x, y;
 25     int step;
 26 };
 27 
 28 int dx[] = { -1, 1, 0, 0 }, dy[] = { 0, 0, 1, -1 };
 29 int T, n, m;
 30 char mp[MAXN][MAXN];
 31 int vis[MAXN][MAXN];
 32 int sx, sy, fx, fy;
 33 int num;
 34 map<node, node> s;
 35 
 36 bool judge(int x, int y)
 37 {
 38     if ( vis[x][y] || x < 0 || y < 0 || x >= n || y >= m)
 39         return true;
 40     return false;
 41 }
 42 
 43 int bfs()
 44 {
 45     queue<dir> q;
 46     q.push({sx,sy,false});
 47     vis[sx][sy] = true;
 48     while (!q.empty())
 49     {
 50         dir now = q.front();
 51         q.pop();
 52         if (now.x == fx && now.y == fy) {
 53             return now.step;
 54         }
 55         //cout << "x = " << now.x;
 56         //cout << "  y = " << now.y << endl;
 57         dir next;
 58         next.step = now.step + 1;
 59         for (int i = 0; i < 4; ++i) {
 60             next.x = now.x + dx[i];
 61             next.y = now.y + dy[i];
 62             if (judge(next.x,next.y)) continue;
 63             if (mp[next.x][next.y] == '#')  continue;
 64             if (mp[next.x][next.y] == '.' || mp[next.x][next.y] == 'Q') {
 65                 q.push({ next.x, next.y,next.step});
 66                 vis[next.x][next.y] = true;
 67 
 68             }
 69             if (mp[next.x][next.y] >= 'a' && mp[next.x][next.y] <= 'z') {
 70                 //cout << "ok" << endl;
 71                 int k = mp[next.x][next.y] - 'a';
 72                 if (next.x == a[k].x1 && next.y == a[k].y1) {
 73                     q.push({ a[k].x2, a[k].y2, next.step });
 74                     //vis[a[k].x1][a[k].y1] = true;     错误的标记
 75                     vis[next.x][next.y] = true;
 76                 }
 77                 else {
 78                     q.push({ a[k].x1, a[k].y1, next.step});
 79                     //vis[next.x][next.y] = true;        错误的标记
 80                     vis[a[k].x2][a[k].y2] = true;
 81                 }
 82             }
 83         }
 84     }
 85     return -1;
 86 }
 87 
 88 void init()
 89 {
 90     memset(a, 0, sizeof(a));
 91     memset(vis, 0, sizeof(vis));
 92     num = 0;
 93 }
 94 
 95 void process()
 96 {
 97     init();
 98     cin >> n >> m;
 99     for (int i = 0; i < n; ++i)
100         cin >> mp[i];
101     for (int i = 0; i < n; ++i)
102         for (int j = 0; j < m; ++j) {
103             if (mp[i][j] == 'Q')
104                 fx = i, fy = j;
105             else if (mp[i][j] == 'L')
106                 sx = i, sy = j;
107             else if (mp[i][j] >= 'a' && mp[i][j] <= 'z'){
108                 int k = mp[i][j] - 'a';
109                 if (a[k].ok == false) {
110                     a[k].x1 = i;
111                     a[k].y1 = j;
112                     a[k].ok = true;
113                 }
114                 else {
115                     a[k].x2 = i;
116                     a[k].y2 = j;
117                 }
118             }
119         }
120     //cout << "sx = " << sx << " sy =" << sy << endl;
121     //cout << "fx = " << fx << " fy =" << fy << endl;
122     cout << bfs() << endl;
123 }
124 
125 int main()
126 {
127     cin >> T;
128     while (T--)
129         process();
130     //system("pause");
131     return 0;
132 }

 

posted @ 2015-01-27 18:24  UsedRose  阅读(229)  评论(0编辑  收藏  举报