首页 > 代码库 > UVA585- Triangles(暴力枚举)
UVA585- Triangles(暴力枚举)
题目链接
题意:找出所给图形中,没有被染色的最大的三角形的面积。
思路:仔细观察图形可以发现大三角形的形成是已一个未染色小三角形为基础,然后一层一层往上叠加(如果整层没被染色)。从上往下看图形不难发现,如果小三角形的底边朝上,叠加是向上形成的,底边朝下,叠加是向下形成的。所以我们可以枚举每一个没有被染色的小三角,更新能叠加的最大的层数,也就能得到最大三角形的面积。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAXN = 1005; char str[MAXN][MAXN]; int g[MAXN][MAXN]; int n, ans, dir; void init() { ans = 0; getchar(); memset(g, -1, sizeof(g)); for (int i = 0; i < n; i++) { gets(str[i]); for (int j = 0; j < strlen(str[i]); j++) if (str[i][j] == '-') g[i][j] = 0; } } void dfs(int x, int y, int cnt) { if (x < 0 || x > n) { ans = max(ans, cnt); return; } for (int i = y - cnt; i <= y + cnt; i++) { if (g[x][i] == -1) { ans = max(ans, cnt); return; } } dfs(x + dir, y, cnt + 1); } int main() { int t = 0; while (scanf("%d", &n) == 1 && n) { init(); for (int i = 0; i < n; i++) { for (int j = i; j < 2 * (n - i) + i - 1; j++) { if (!g[i][j]) { if ((i + j) % 2) { dir = 1; dfs(i, j, 0); } else { dir = -1; dfs(i, j, 0); } } } } printf("Triangle #%d\n", ++t); printf("The largest triangle area is %d.\n\n", ans * ans); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。