预处理出每个点八个方向能走的最远距离,然后枚举起点,枚举方向,每走一步都要枚举左转和右转的情况,因为预处理好了,所以可以直接算出来。

 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 }
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-09-06
  • 2022-12-23
  • 2021-11-07
  • 2021-09-30
猜你喜欢
  • 2021-08-29
  • 2021-12-27
  • 2022-02-15
  • 2022-12-23
  • 2021-10-10
  • 2022-12-23
相关资源
相似解决方案