题目地址:toj1056
接上一篇 同样 还是求树的直径
直接两遍dfs
代码:
#include<iostream>
#include<utility>
#include<map>
#include<cstring>
using namespace std;
#define INF 1000000000
typedef pair<int, int> pii;
map<pii,int> map;
char p[1005][1005];
bool vis[1005][1005];
int dis[1005][1005];
int a,b;
int n,m;
void init()
{
memset(vis, 0, sizeof(vis));
int startx=a;
int starty=b;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
dis[i][j]=(i==startx&&j==starty?0:INF);
}
void dfs(int x,int y)
{
vis[x][y]=1;
if(x<n-1)
{
if(!vis[x+1][y]&&p[x+1][y]!='#')
{
dis[x+1][y]=dis[x][y]+1;
dfs(x+1,y);
}
}
if(y<m-1)
{
if(!vis[x][y+1]&&p[x][y+1]!='#')
{
dis[x][y+1]=dis[x][y]+1;
dfs(x,y+1);
}
}
if(x>0)
{
if(!vis[x-1][y]&&p[x-1][y]!='#')
{
dis[x-1][y]=dis[x][y]+1;
dfs(x-1,y);
}
}
if(y>0)
{
if(!vis[x][y-1]&&p[x][y-1]!='#')
{
dis[x][y-1]=dis[x][y]+1;
dfs(x,y-1);
}
}
}
int main()
{
int cas;
cin>>cas;
while(cas--)
{
cin>>m>>n;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
cin>>p[i][j];
}
// for(int i=0;i<n;i++)
// {
// for(int j=0;j<m;j++)
// cout<<p[i][j];
//
// cout<<endl;
// }
bool find=0;
for(int i=0;i<n;i++)
{
if(find) break;
for(int j=0;j<m;j++)
if(p[i][j]=='.')
{
a=i;
b=j;
find=1;
break;
}
}
init();
dfs(a,b);
int maxi=0;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
if(dis[i][j]!=INF&&dis[i][j]>maxi)
{
maxi=dis[i][j];
a=i;
b=j;
}
}
init();
dfs(a,b);
maxi=0;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
if(dis[i][j]!=INF&&dis[i][j]>maxi)
{
maxi=dis[i][j];
}
}
cout<<"Maximum rope length is "<<maxi<<"."<<endl;
}
}