585 - Triangles(简单题)

45 篇文章 0 订阅
11 篇文章 0 订阅

很简单的题目,通过观察可以发现,每一行的奇数个都是尖头向下的三角形,偶数个都是尖头向上的。 所以我们不妨分一下类,对于尖头向上的就向下扩展,反之向上扩展。如果可以拓展就更新答案。

细节参见代码:

#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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值