预处理出每个点八个方向能走的最远距离,然后枚举起点,枚举方向,每走一步都要枚举左转和右转的情况,因为预处理好了,所以可以直接算出来。
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 const int M=128; 5 char a[M][M]; 6 int n,dp[M][M][8]; 7 int dx[]={-1,-1,0,1,1,1,0,-1}; 8 int dy[]={0,1,1,1,0,-1,-1,-1}; 9 bool inside(const int &x,const int &y){ 10 if(x>=0&&x<n&&y>=0&&y<n) return true;return false; 11 } 12 int getfar(int x,int y,int dir){ 13 int res=0; 14 while(true){ 15 x+=dx[dir]; 16 y+=dy[dir]; 17 if(!inside(x,y)||a[x][y]=='#') break; 18 res++; 19 } 20 return res; 21 } 22 int turnleft(int dir){ 23 return (dir+6)%8; 24 } 25 int turnright(int dir){ 26 return (dir+2)%8; 27 } 28 int solve(int x,int y,int dir){ 29 int res=1,step=1,left=turnleft(dir),right=turnright(dir); 30 while(true){ 31 x+=dx[dir]; 32 y+=dy[dir]; 33 if(!inside(x,y)||a[x][y]=='#') break; 34 step++; 35 res=max(res,step+dp[x][y][left]); 36 res=max(res,step+dp[x][y][right]); 37 } 38 return res; 39 } 40 int main(){ 41 while(~scanf("%d",&n),n){ 42 for(int i=0;i<n;i++){ 43 scanf("%s",a[i]); 44 } 45 for(int i=0;i<n;i++){ 46 for(int j=0;j<n;j++){ 47 for(int k=0;k<8;k++){ 48 if(a[i][j]=='#'){ 49 dp[i][j][k]=-1; 50 } 51 else{ 52 dp[i][j][k]=getfar(i,j,k); 53 } 54 } 55 } 56 } 57 int ans=0; 58 for(int i=0;i<n;i++){ 59 for(int j=0;j<n;j++){ 60 if(a[i][j]=='.'){ 61 for(int k=0;k<8;k++){ 62 int now=solve(i,j,k); 63 ans=max(ans,now); 64 } 65 } 66 } 67 } 68 printf("%d\n",ans); 69 } 70 return 0; 71 }