给以个n*n的矩阵地图,‘.’ 能走,‘#’不能走,求一段最长的路 , 这条路最多只能拐一次弯,或者不拐,一个弯是90度 ;
走的方向有8个,东,南,西,北,东南,西南..... 一条路的长度是包含的‘.’的数目 ;
先预处理每个点8个方向能走的最大长度,然后暴力枚举以i点开头能走的最大长度 ,
注意 ,向左或向右走的时候 ,下一次方向 要么向上或者向下 . 因为要保证最多只能拐一次弯,而且是90度 ;
#include<cstdio>
#include<cstring>
#include<map>
#include<vector>
#include<cmath>
#include<cstdlib>
#include<stack>
#include<queue>
#include <iomanip>
#include<iostream>
#include<algorithm>
using namespace std ;
const int N=110 ;
char g[N][N] ;
int a[N*N][8] ;
int n;
void make(int q , int w)
{
int tmp=q*n+w;
for(int i = 0 ; i < 8 ; i++ )
{
int x=q,y=w;
if(i==0)
{
while(g[x-1][y]=='.'&& x>0 )
{
a[tmp][i]++;x--;
}
a[tmp][i]++;
}
else if(i==1)
{
while( g[x-1][y+1]=='.' && x>0 && y< (n-1) )
{
a[tmp][i]++ ; x--;y++;
}a[tmp][i]++;
}
else if(i==2)
{
while(g[x][y+1]=='.' && y < (n-1))
{
a[tmp][i]++;y++;
}a[tmp][i]++;
}else if(i==3)
{
while(g[x+1][y+1]=='.' && x <(n-1) && y < (n-1))
{
a[tmp][i]++;x++,y++;
}a[tmp][i]++;
}else if(i==4)
{
while(g[x+1][y]=='.'&& x < (n-1))
{
a[tmp][i]++;x++;
}a[tmp][i]++;
}else if(i==5)
{
while(g[x+1][y-1]=='.'&& y > 0 && x < (n-1))
{
a[tmp][i]++;x++,y--;
}a[tmp][i]++;
}else if(i==6)
{
while(g[x][y-1]=='.'&& y > 0)
{
a[tmp][i]++;y--;
}a[tmp][i]++;
}else if(i==7)
{
while(g[x-1][y-1]=='.'&& x > 0&& y> 0)
{
a[tmp][i]++;x--;y--;
}a[tmp][i]++;
}
}
}
int main()
{
while(~scanf("%d",&n))
{ getchar();
if(n==0) break;
for(int i = 0 ; i < n ; i++)
scanf("%s",g[i]) ;
memset(a,0,sizeof(a));
for(int i = 0 ; i < n ; i++)
for(int j = 0 ; j < n ; j++)
{
if(g[i][j]=='.')
{ //printf("***");
int tmp = i*n+j ;
make(i,j) ;
}
}
int sum = 0;
for( int i = 0 ; i < n ; i++)
for(int j = 0 ; j < n ; j++)
{
if(g[i][j]=='.')
{
int tmp = i*n+j ,ans =0;
for(int k = 0 ; k < 8 ; k++)
{
if(k==0)
{
int Max = max( a[tmp][k]+a[(i-(a[tmp][k])+1)*n+j][6]-1 ,
a[tmp][k]+a[(i-(a[tmp][k])+1)*n+j][2]-1) ;
ans = max( ans , Max) ;
}
else if(k==1)
{
int Max = max( a[tmp][k]+a[(i-(a[tmp][k])+1)*n+j+a[tmp][k]-1][7]-1 ,
a[tmp][k]+a[(i-(a[tmp][k])+1)*n+j+a[tmp][k]-1][3]-1) ;
ans = max( ans , Max) ;
}
else if(k==2)
{
int Max = max( a[tmp][k]+a[i*n+j+a[tmp][k]-1][0]-1 ,
a[tmp][k]+a[i*n+j+a[tmp][k]-1][4]-1) ;
ans= max( ans , Max) ;
}
else if(k==3)
{
int Max = max( a[tmp][k]+a[(i+(a[tmp][k])-1)*n+j+a[tmp][k]-1][1]-1 ,
a[tmp][k]+a[(i+(a[tmp][k])-1)*n+j+a[tmp][k]-1][5]-1 ) ;
ans = max( ans , Max) ;
}
else if(k==4)
{
int Max = max( a[tmp][k]+a[(i+a[tmp][k]-1)*n+j][6]-1 ,
a[tmp][k]+a[(i+a[tmp][k]-1)*n+j][2]-1) ;
ans = max( ans , Max) ;
}
else if(k==5)
{
int Max = max( a[tmp][k]+a[(i+a[tmp][k]-1)*n+j-a[tmp][k]+1][7]-1 ,
a[tmp][k]+a[(i+a[tmp][k]-1)*n+j-a[tmp][k]+1][3]-1) ;
ans = max( ans , Max) ;
}
else if(k==6)
{
int Max = max( a[tmp][k]+a[i*n+j-a[tmp][k]+1][0]-1 ,
a[tmp][k]+a[i*n+j-a[tmp][k]+1][4]-1) ;
ans = max( ans, Max) ;
}
else if(k==7)
{
int Max = max( a[tmp][k]+a[(i-a[tmp][k]+1)*n+j-a[tmp][k]+1][1]-1 ,
a[tmp][k]+a[(i-a[tmp][k]+1)*n+j-a[tmp][k]+1][5]-1 ) ;
ans = max( ans , Max) ;
}
}
sum = max(ans,sum);
}
}
printf("%d\n",sum);
}
return 0;
}