题意:求一个图中只有一个90°拐点的路的最大长度。
分析:枚举每一个为‘.’的点,求出以该点为拐点的八种路中的最大长度,再比较所有点,得出最大长度即可。
如上样例,这样是个90°的角...
注意:最多只有一个拐点,但是通过枚举每一个点的方法,可以在枚举到一条没有拐点的路的端点处时计算出这条路的长度,所以不用特判平角的情况。
#include<cstdio> #include<cstring> #include<cstdlib> #include<cctype> #include<cmath> #include<iostream> #include<sstream> #include<iterator> #include<algorithm> #include<string> #include<vector> #include<set> #include<map> #include<stack> #include<deque> #include<queue> #include<list> #define Min(a, b) a < b ? a : b #define Max(a, b) a < b ? b : a typedef long long ll; typedef unsigned long long llu; const int INT_INF = 0x3f3f3f3f; const int INT_M_INF = 0x7f7f7f7f; const ll LL_INF = 0x3f3f3f3f3f3f3f3f; const ll LL_M_INF = 0x7f7f7f7f7f7f7f7f; const int dr[] = {0, 0, -1, 1}; const int dc[] = {-1, 1, 0, 0}; const double pi = acos(-1.0); const double eps = 1e-8; const int MOD = 1e9 + 7; const int MAXN = 100 + 10; const int MAXT = 10000 + 10; using namespace std; char s[MAXN][MAXN]; int a[MAXN]; int N; int solve(int a, int b){ int cnt[10]; memset(cnt, 0, sizeof cnt); for(int i = b - 1; i >= 0; --i){//从该点向左走 if(s[a][i] == '.') ++cnt[0]; else break; } for(int i = a - 1, j = b - 1; i >= 0 && j >= 0; --i, --j){//从该点向左上走,以下按顺时针依次求 if(s[i][j] == '.') ++cnt[1]; else break; } for(int i = a - 1; i >= 0; --i){ if(s[i][b] == '.') ++cnt[2]; else break; } for(int i = a - 1, j = b + 1; i >= 0 && j < N; --i, ++j){ if(s[i][j] == '.') ++cnt[3]; else break; } for(int i = b + 1; i < N; ++i){ if(s[a][i] == '.') ++cnt[4]; else break; } for(int i = a + 1, j = b + 1; i < N && j < N; ++i, ++j){ if(s[i][j] == '.') ++cnt[5]; else break; } for(int i = a + 1; i < N; ++i){ if(s[i][b] == '.') ++cnt[6]; else break; } for(int i = a + 1, j = b - 1; i < N && j >= 0; ++i, --j){ if(s[i][j] == '.') ++cnt[7]; else break; } int sum = 0; for(int i = 0; i < 8; ++i){ sum = Max(sum, cnt[i] + cnt[(i + 2) % 8] + 1); } return sum; } int main(){ while(scanf("%d", &N) == 1){ if(N == 0) return 0; memset(s, 0, sizeof s); memset(a, 0, sizeof a); for(int i = 0; i < N; ++i){ scanf("%s", s[i]); } int cnt = 0; for(int i = 0; i < N; ++i){ for(int j = 0; j < N; ++j){ if(s[i][j] == '.'){ a[cnt++] = solve(i, j); } } } sort(a, a + cnt); printf("%d\n", a[cnt - 1]); } return 0; }