思路要开阔些,或者说要转化一下思路,别太死

把每一个点当拐点,爆一边就能够。用记忆化搜索也行。都不会超时

#include<bits/stdc++.h>
using namespace std;
int n;
#define o ans=max(ans,
char C[105][105];

int f(int i,int j,int a,int b){
    int k=0;
    while(1){
        if(i<0||j<0||i>=n||j>=n||C[i][j]!='.') break;
        i+=a; j+=b; k++;
    }
    return k;
}

int main()
{
    while(scanf("%d",&n)&&n){
        for(int i=0;i<n;i++ ) scanf("%s",C[i]);
        int ans=-1;
        for(int i=0;i<n;i++)
        for(int j=0;j<n;j++){
            if(C[i][j]=='.'){
                o f(i,j,0,1)+f(i,j,1,0)-1);
                o f(i,j,0,1)+f(i,j,-1,0)-1);
                o f(i,j,0,-1)+f(i,j,1,0)-1);
                o f(i,j,0,-1)+f(i,j,-1,0)-1);
                o f(i,j,-1,1)+f(i,j,1,1)-1);
                o f(i,j,1,1)+f(i,j,1,-1)-1);
                o f(i,j,-1,-1)+f(i,j,1,-1)-1);
                o f(i,j,-1,-1)+f(i,j,-1,1)-1);
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

#include<bits/stdc++.h>
using namespace std;
#define maxn 105
int n;
const int dx[]= {0,-1,0,1,-1,1,1,-1};
const int dy[]= {-1,0,1,0,-1,-1,1,1};
int dp[maxn][maxn][8] , ans;
char mapp[maxn][maxn];
int DFS(int x,int y,int dir){
    if(dp[x][y][dir]!=-1) return dp[x][y][dir];
    if(mapp[x +dx[dir] ][y+ dy[dir] ]=='.')
        return dp[x][y][dir]=1+DFS(x+dx[dir],y+dy[dir],dir);
    else return dp[x][y][dir]=1;
}
void cal(int x,int y,int d1,int d2){
    ans = max(ans, DFS(x,y,d1)+DFS(x,y,d2)-1);
}
int main()
{
    while(scanf("%d",&n)!=EOF && n){
        memset(mapp,1,sizeof(mapp));
            memset(dp,-1,sizeof(dp));
            ans=-1;
        for(int i=0;i<n;i++) scanf("%s",mapp[i]);
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
        {
            if(mapp[i][j]=='.'){
                for(int k=0;k<4;k++){
                    cal(i,j,k%4,(k+1)%4);
                    cal(i,j,4+k%4,4+(k+1)%4);
                }
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}