本来是打算对每个可行点做BFS,每个点都有两个方向的分量,然后扩展点只扩展与之前垂直的方向。不过看了别人的Blog发现直接枚举拐点更容易,复杂度N*N*16*N
本机调试了好久,结果是因为有个地方敲错了。。果真以后结果不对要先仔细看看代码。。。。
#include<iostream>
#include<stdio.h>
#include<cstdio>
#include<stdlib.h>
#include<vector>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<stack>
#include<queue>
#include <ctype.h>
using namespace std;
const int maxn=110;
int N;
int mp[maxn][maxn];
int ans;
int dx[]={0,-1,0,1,-1,-1,1,1};
int dy[]={-1,0,1,0,-1,1,1,-1};
int vertical[9]={1,2,3,0,5,6,7,4};//预处理垂直的方向
void bruteforce()
{
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
if(mp[i][j]==1)
{
// cout<<i<<" "<<j<<endl;
for(int d=0;d<8;d++)
{
int d2=vertical[d];
int len=1;
int x=i;
int y=j;
bool dd=0;
while(x+dx[d]>=0&&x+dx[d]<N&&y+dy[d]>=0&&y+dy[d]<N&&mp[x+dx[d]][y+dy[d]]==1)
{
x=x+dx[d];
y=y+dy[d];
len++;
dd=1;
// if(i==0&&j==0) cout<<d<<" d "<<x<<" "<<y<<" "<<len<<endl;
}
// cout<<endl;
x=i;
y=j;
bool dd2=1;
while(x+dx[d2]>=0&&x+dx[d2]<N&&y+dy[d2]>=0&&y+dy[d2]<N&&mp[x+dx[d2]][y+dy[d2]]==1)
{
dd2=0;
x=x+dx[d2];
y=y+dy[d2];
len++;
// if(i==0&&j==0) cout<<d<<" d2 "<<x<<" "<<y<<" "<<len<<endl;
}
ans=max(ans,len);
// cout<<dx[d]<<" "<<dy[d]<<endl;
//cout<<i<<" "<<j<<" "<<len<<endl;
//cout<<i<<" "<<j<<endl;
}
}
}
}
}
int main()
{
freopen("input.txt","r",stdin);
// freopen("data.txt","r",stdin);
// freopen("out1.txt","w",stdout);
while(true)
{
scanf("%d",&N);
memset(mp,0,sizeof(mp));
ans=0;
if(N==0) break;
else
{
char s;
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
//scanf("%c",&s);
cin>>s;
if(s=='#')
{
mp[i][j]=0;
}
else if(s=='.')
{
mp[i][j]=1;
}
}
}
bruteforce();
printf("%d\n",ans);
}
}
return 0;
}