很简单的题目,通过观察可以发现,每一行的奇数个都是尖头向下的三角形,偶数个都是尖头向上的。 所以我们不妨分一下类,对于尖头向上的就向下扩展,反之向上扩展。如果可以拓展就更新答案。
细节参见代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF = 1000000000;
const int maxn = 100+5;
int n,m,kase = 0;
char s[maxn][2*maxn];
int main() {
while(~scanf("%d",&n)&&n) {
getchar();
int ans = 0;
for(int i=1;i<=n;i++) gets(s[i]+1);
for(int i=1;i<=n;i++) {
int v = 0;
for(int j=i;j<=2*n-i;j++) {
++v;
if(s[i][j] == '#') continue;
if(v%2) {
int l = j-1, r = j+1, rol = i-1, cur = 1;
while(true) {
if(l < rol || r > 2*n-rol) break;
if(rol < 1) break;
bool ok = true;
for(int k=l;k<=r;k++) {
if(s[rol][k] == '#') { ok = false; break; }
}
if(ok) cur += (r-l+1), rol--, --l , ++r ;
else break;
}
ans = max(ans,cur);
}
else {
int l = j-1, r = j+1, rol = i+1, cur = 1;
while(true) {
if(l < rol || r > 2*n-rol) break;
if(rol > n) break;
bool ok = true;
for(int k=l;k<=r;k++) {
if(s[rol][k] == '#') { ok = false; break; }
}
if(ok) cur += (r-l+1), rol++, --l, ++r;
else break;
}
ans = max(ans,cur);
}
}
}
printf("Triangle #%d\n",++kase);
printf("The largest triangle area is %d.\n\n",ans);
}
return 0;
}