Time Limit: 2000MS | Memory Limit: 32768K | |
Total Submissions: 3990 | Accepted: 1501 |
Description
Input
Output
Sample Input
2 3 3 ### #.# ### 7 6 ####### #.#.### #.#.### #.#.#.# #.....# #######
Sample Output
Maximum rope length is 0. Maximum rope length is 8.
Hint
If you use recursion, maybe stack overflow. and now C++/c 's stack size is larger than G++/gcc
题意:给你一个N*M的迷宫,迷宫里面有' # '和 ' . ' 两种字符,问你距离最远的两个' . '之间的距离。
读懂题意就很简单了, 就是在迷宫图里面用二维来模拟一维求树的直径。两次BFS就行了。
思路:首先找到任意一个' . '的坐标(x1, y1),然后以该坐标为起点BFS整个迷宫找最长路,找到该坐标对应最长路的终点(x2, y2)。再以(x2, y2)为起点BFS整个迷宫找最长路即可。
AC代码:
#include <cstdio> #include <cstring> #include <queue> #include <algorithm> #define MAXN 1000+10 using namespace std; struct Node { int x, y, step; }; Node now, next; int N, M; char Map[MAXN][MAXN]; bool vis[MAXN][MAXN]; int sx, sy; int ans;//最长路 最后的结果 void getMap() { bool flag = false; for(int i = 0; i < N; i++) { scanf("%s", Map[i]); if(flag) continue;//找到一个 不用再找第二个 for(int j = 0; j < M; j++) { if(Map[i][j] == '.') { sx = i; sy = j; flag = true; } } } } bool judge(int x, int y)//判断下一位的移动是否合法 { return x >= 0 && x < N && y >= 0 && y < M && Map[x][y] != '#' && !vis[x][y]; } void BFS(int x, int y) { queue<Node> Q; int move[4][2] = {0,1, 0,-1, 1,0, -1,0}; memset(vis, false, sizeof(vis)); Node now = {x, y, 0}; Q.push(now); ans = 0; while(!Q.empty()) { now = Q.front(); Q.pop(); for(int k = 0; k < 4; k++) { next.x = now.x + move[k][0]; next.y = now.y + move[k][1]; next.step = now.step + 1; if(judge(next.x, next.y)) { vis[next.x][next.y] = true; if(next.step > ans) { ans = next.step; sx = next.x; sy = next.y; } Q.push(next); } } } } void solve() { BFS(sx, sy);//找S-T端点 BFS(sx, sy);//找最长路 printf("Maximum rope length is %d.\n", ans); } int main() { int t; scanf("%d", &t); while(t--) { scanf("%d%d", &M, &N); getMap(); solve(); } return 0; }