题意:找两个点,距离最远,并且中间只能转一个弯。每个点可以向相邻的八个方向走
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int m[105][105];
int dir[8][2]={-1,0,0,-1,0,1,1,0,-1,-1,1,-1,1,1,-1,1};
bool vis[105][105];
int n;
int dfs(int i,int j,int ldir,bool turn,int s)
{
// cout<<i<<' '<<j<<' '<<ldir<<endl;
vis[i][j]=1;
int ret=0;
for(int d=s;d<s+4;++d)
{
if(turn==1&&d!=ldir)continue;
int ii=i+dir[d][0];
int jj=j+dir[d][1];
// cout<<"???"<<ii<<' '<<jj<<' '<<s<<' '<<dir[d][0]<<' '<<dir[d][1]<<endl;
if(vis[ii][jj])continue;
if(i+dir[d][0]>=0&&i+dir[d][0]<n&&j+dir[d][1]>=0&&j+dir[d][1]<n)
{
// cout<<"zzzzzzzzzzzzzz"<<ii<<' '<<jj<<' '<<m[ii][jj]<<endl;
if(m[ii][jj]==1)
{
// cout<<"pppppppppppp"<<endl;
if(d==ldir)
{
// cout<<"1111"<<endl;
ret=max(ret,1+dfs(ii,jj,d,turn,s));
}
else if(ldir==-1)
{
// cout<<"2222"<<endl;
ret=max(ret,1+dfs(ii,jj,d,turn,s));
}
else
{
// cout<<"3333"<<' '<<turn<<' '<<d<< ' '<<ldir<<endl;
ret=max(ret,1+dfs(ii,jj,d,1,s));
}
}
}
}
// cout<<"ret="<<ret<<endl;
return ret;
}
int main()
{
// freopen("data.txt","r",stdin);
while(scanf("%d",&n))
{
// cout<<"n="<<n<<endl;
if(n==0)break;
int tot=0;
for(int i=0;i<n;++i)
{
for(int j=0;j<n;++j)
{
char p;
scanf("%c",&p);
while(p!='.'&&p!='#')p=getchar();
if(p=='.'){m[i][j]=1;}
else m[i][j]=0;
}
}
// for(int i=0;i<n;++i)
// {
// for(int j=0;j<n;++j)
// cout<<m[i][j];
// cout<<endl;
// }
int ans=0;
for(int i=0;i<n;++i)
{
for(int j=0;j<n;++j)
{
// cout<<m[i][j]<<' ';
if(m[i][j]==1)
{
memset(vis,0,sizeof(vis));
ans=max(ans,dfs(i,j,-1,0,0));
memset(vis,0,sizeof(vis));
ans=max(ans,dfs(i,j,-1,0,4));
}
}
// cout<<endl;
}
// cout<<endl;
printf("%d\n",ans+1);
}
return 0;
}