1188.cpp

来自「这是哈尔滨工业大学acmOJ的源代码」· C++ 代码 · 共 55 行

CPP
55
字号
/*  This Code is Submitted by wywcgs for Problem 1188 on 2006-02-24 at 16:16:36 */ 
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;

const double eps = 1e-5;

double x[3], y[3];

int hori(int);
inline int up(double m) { return max((int)(ceil(m-eps)), 1); }
inline int down(double m) { return min((int)(floor(m+eps)), 99); }
inline bool integer(double m) { return fabs(m-up(m)) < eps; }

int main()
{
	int i;

	while(true) {
		bool end = true;
		for(i = 0; i < 3; i++) {
			scanf("%lf %lf", &x[i], &y[i]);
			if(fabs(x[i]) > eps || fabs(y[i]) > eps) end = false;
		}
		if(end) break;
		int d = 200, u = 0, total = 0;
		for(i = 0; i < 3; i++) { d = min(d, up(y[i])); u = max(u, down(y[i])); }
		for(i = d; i <= u; i++) total += hori(i);
		printf("%4d\n", total);
	}
	
	return 0;
}

int hori(int cy)
{
	int i, xn = 0, tn = 0; double xl[8];
	for(i = 0; i < 3; i++) {
		if(cy < min(y[i], y[(i+1)%3]) || cy > max(y[i], y[(i+1)%3])) continue;
		double dy = y[(i+1)%3]-y[i], dx = x[(i+1)%3]-x[i], cdy = cy-y[i];
		if(fabs(dy) < eps) {
			if(fabs(dx) < eps && integer(x[i]) && integer(y[i])) xl[xn++] = x[i];
			else if(fabs(y[i]-cy) < eps) xl[xn++] = x[i], xl[xn++] = x[(i+1)%3];
			continue;
		}
		xl[xn++] = dx * cdy / dy + x[i];
	}
	sort(xl, xl+xn);
	for(i = 0; i < xn; i++)
		if(i == 0 || fabs(xl[i]-xl[i-1]) > eps) xl[tn++] = xl[i];
	if(tn == 0) return 0;
	return down(xl[tn-1])-up(xl[0])+1;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?