1 条题解
-
0
思路:要找出图中一条最长的路。先从任意一点开始用bfs把迷宫遍历一遍。然后找到那些距离bfs起点最远的点,然后用这些点再bfs一遍,就可以找到一条最长路了。
#include<iostream> #include<cstring> #include<cmath> #include<queue> #include<cstdio> #include<algorithm> using namespace std; int v[1001][1001]; int d[4][2]={-1,0,0,-1,1,0,0,1}; char s[1001][1001]; int n,m; int bfs(int x,int y) { memset(v,0,sizeof v); int ans=1; v[x][y]=1; queue<int>p; p.push(x); p.push(y); while(!p.empty()) { x=p.front();p.pop(); y=p.front();p.pop(); ans=max(ans,v[x][y]); for(int i=0;i<4;i++) { int nx=x+d[i][0]; int ny=y+d[i][1]; if(nx>=0&&nx<n&&ny>=0&&ny<m&&s[nx][ny]=='.'&&v[nx][ny]==0) { v[nx][ny]=v[x][y]+1; p.push(nx); p.push(ny); } } } return ans-1; } int main() { int T;cin>>T; while(T--) { memset(v,0,sizeof v); scanf("%d%d",&m,&n); for(int i=0;i<n;i++)scanf("%s",s[i]); int ans=0; for(int i=0;i<n;i++) //第一次bfs { for(int j=0;j<m;j++) { if(s[i][j]=='.'&&v[i][j]==0)bfs(i,j); ans=max(ans,v[i][j]); } } vector<int>p; for(int i=0;i<n;i++) //把最远的点找出来放入p里面 { for(int j=0;j<m;j++) { if(ans==v[i][j])p.push_back(i),p.push_back(j); } } ans=0; for(int i=0;i<p.size();i+=2) //第二次bfs求最长路 { ans=max(ans,bfs(p[i],p[i+1])); } printf("Maximum rope length is %d.\n",ans); } return 0; }
- 1
信息
- ID
- 384
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 11
- 已通过
- 2
- 上传者