简单 有意思的迷宫问题
主要看平时标记的习惯吧。。 一开始就跪了,多亏迪哥给了组数据。。
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 }