UVa:585 Triangles

来源:互联网 发布:程序编程入门 编辑:程序博客网 时间:2024/05/21 08:05

根据给的图可以发现要找的三角形一定是等边的,所以每层是1,3,5。。这样。只需要枚举三角形的顶点即可。枚举的时候要注意小三角形,不是该位置为“-”就行的,还要注意小三角形的开口方向。由于有两种方向,所以还要倒着枚举一遍即可。

#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <cmath>#include <vector>#include <queue>#include <set>#include <map>#include <algorithm>#define ull unsigned long long#define INF 2139062143#define inf -2139062144#define MOD 20071027#define MAXN  205#define LIM 18446744073709551615using namespace std;int n;char grid[MAXN][MAXN];inline bool Judge(int x,int y) //{    int m=2*n-x;    if(!(1<=x&&x<=n)||!(x<=y&&y<=m)||grid[x][y]!='-') return false;    return true;}int ans;void solve1(){    for(int i=1; i<=n; ++i)        for(int j=i,k=1; j<=2*n-i; ++j,++k)            if(grid[i][j]=='-'&&0==k%2)            {                int res=1;                for(int p=i+1,c=1; p<=n; ++p,++c)                    if(grid[p][j]=='-')                    {                        bool ok=true;                        for(int q=j-1,cc=0; cc<c&&ok; ++cc,--q)                            if(!Judge(p,q)) ok=false;                        for(int q=j+1,cc=0; cc<c&&ok; ++cc,++q)                            if(!Judge(p,q)) ok=false;                        if(ok) res+=2*c+1;                        else break;                    }                    else break;                ans=max(ans,res);            }}void solve2(){    for(int i=n; i>=1; --i)        for(int j=i,k=1; j<=2*n-i; ++j,++k)            if(grid[i][j]=='-'&&1==k%2)            {                int res=1;                for(int p=i-1,c=1; p>=1; --p,++c)                    if(grid[p][j]=='-')                    {                        bool ok=true;                        for(int q=j-1,cc=0; cc<c&&ok; ++cc,--q)                            if(!Judge(p,q)) ok=false;                        for(int q=j+1,cc=0; cc<c&&ok; ++cc,++q)                            if(!Judge(p,q)) ok=false;                        if(ok) res+=2*c+1;                        else break;                    }                    else break;                ans=max(ans,res);            }}int main(){    int kase=0;    while(scanf("%d",&n)&&n)    {        getchar();        for(int i=1; i<=n; ++i)            gets(grid[i]+1);        ans=0;        solve1();        solve2();        printf("Triangle #%d\n",++kase);        printf("The largest triangle area is %d.\n\n",ans);    }    return 0;}


 

0 0
原创粉丝点击