UVA - 585 Triangles

题意:求最大的三角形

思路:先初始化从左到右和从右到左的最大连续的‘-’,然后就是当奇数列的时候找头向下的三角形,偶数的时候相反找

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 200;

char  map[MAXN][MAXN];
int Left[MAXN][MAXN], Right[MAXN][MAXN];
int n;

int main() {
	int cas = 1;
	while (scanf("%d", &n) != EOF && n) {
		memset(map, 0, sizeof(map));
		memset(Left, 0, sizeof(Left));
		memset(Right, 0, sizeof(Right));
		for (int i = 1; i <= n; i++)
			scanf("%s", map[i]+1);
		for (int i = 1; i <= n; i++) {
			int len = strlen(map[i]+1);
			for (int j = len; j >= 1; j--)
				if (map[i][j] == '-')
					Left[i][j] = Left[i][j+1] + 1;
				else Left[i][j] = 0;
			for (int j = 1; j <= len; j++)
				if (map[i][j] == '-')
					Right[i][j] = Right[i][j-1] + 1;
				else Right[i][j] = 0;
		}
		int ans = -1;
		for (int i = 1; i <= n; i++) {
			int len = strlen(map[i]+1);
			for (int j = 1; j <= len; j++)
				if (j&1) {
					int x = 0;
					while (i-x >= 1 && Left[i-x][j] >= 2*x+1)
						x++;
					ans = max(ans, x);
				}
				else {
					int x = 0;
					while (x+i <= n && Right[x+i][j] >= 2*x+1)
						x++;
					ans = max(ans, x);
				}
		}
		printf("Triangle #%d\nThe largest triangle area is %d.\n\n", cas++, ans*ans);
	}
	return 0;
}

UVA - 585 Triangles

时间: 2024-10-11 03:22:04

UVA - 585 Triangles的相关文章

uva 12508 - Triangles in the Grid(几何+计数)

题目链接:uva 12508 - Triangles in the Grid 题目大意:给出n,m,A和B,要求计算在(n+1)?(m+1)的矩阵上,可以找出多少个三角形,面积在AB之间. 解题思路:首先枚举矩阵,然后计算有多少个三角形以该矩阵为外接矩阵,并且要满足体积在AB之间.然后对于每个矩阵,要确定在大的范围内可以确定几个. 枚举矩阵的内接三角形可以分为三类: 1.三角型的两点在一条矩阵边上的顶点,另一点在该边的对边上(不包括顶点) 2.以对角线为三角形的一边 这样可以枚举x,然后求出l和

UVA 12508 - Triangles in the Grid(计数问题)

今天做作业连了一天的mysql. 最后我痛定思痛,决定从0开始学习jsp,省的又面临不会的局面. 忙活了一晚上,终于把数据库连接上了,不过,好伤心啊,我连个数据库都这么墨迹... <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@page import="data.database"%> <%@page

UVA - 12075 Counting Triangles

Description Triangles are polygons with three sides and strictly positive area. Lattice triangles are the triangles all whose vertexes have integer coordinates. In this problem you have to find the number of lattice triangles in anMxN grid. For examp

uva 12075 - Counting Triangles(容斥原理)

题目链接:uva 12075 - Counting Triangles 题目大意:一个n?m的矩阵,求说有选任意三点,可以组成多少个三角形. 解题思路:任意选三点C(3(n+1)?(m+1))但是有些组合是不可行得,即为三点共线,除了水平和竖直上的组合,就是斜线上的了,dp[i][j]即为ij情况下的斜线三点共线. #include <cstdio> #include <cstring> typedef long long ll; const int N = 1005; ll dp

UVA 12075 - Counting Triangles(容斥原理计数)

题目链接:12075 - Counting Triangles 题意:求n * m矩形内,最多能组成几个三角形 这题和UVA 1393类似,把总情况扣去三点共线情况,那么问题转化为求三点共线的情况,对于两点,求他们的gcd - 1,得到的就是他们之间有多少个点,那么情况数就可以求了,然后还是利用容斥原理去计数,然后累加出答案 代码: #include <stdio.h> #include <string.h> #include <algorithm> using nam

uva 11275 3D Triangles

题意:三维空间中,给出两个三角形的左边,问是否相交. 面积法判断点在三角形内: 1 #include<cstdio> 2 #include<cmath> 3 #include<cstring> 4 #include<algorithm> 5 #include<iostream> 6 #include<memory.h> 7 #include<cstdlib> 8 #include<vector> 9 #defi

UVA 1393 Highways,UVA 12075 Counting Triangles —— (组合数,dp)

先看第一题,有n*m个点,求在这些点中,有多少条直线,经过了至少两点,且不是水平的也不是竖直的. 分析:由于对称性,我们只要求一个方向的线即可.该题分成两个过程,第一个过程是求出n*m的矩形中,dp[i][j]代表在这个矩形中终点是到(i,j)这个点的满足题意的直线条数,那么,用dp的话就可以得出递推关系:由长和宽分别小1的左右两个矩形中满足题意的线的条数减去他们共有的矩形中满足的线的条数(容斥减去重复部分),之后还要判断从最左上角的点(1,1)到(i,j)是否可以组成一条线,这个条件是gcd(

Uva 12075 Counting Triangles(容斥)

/* 思路:1.先选三个点 2.去掉同行情况 3.去掉同列情况 4.枚举矩形大小去掉重复情况 */ #pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue&g

UVA - 11437 - Triangle Fun (计算几何~)

UVA - 11437 Triangle Fun Time Limit: 1000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Submit Status Description Problem A Triangle Fun Input: Standard Input Output: Standard Output In the picture below you can see a triangle ABC. Point D, E