思路要开阔些,或者说要转化一下思路,别太死
把每一个点当拐点,爆一边就能够。用记忆化搜索也行。都不会超时
#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 ",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 ",ans); } return 0; }