链接:https://www.nowcoder.com/acm/contest/135/E
来源:牛客网
题目描述
定义“最大生成图”:在M*N的点阵中,连接一些点形成一条经过所有点恰好一次的回路,且连成的多边形各边互不交叉。这样形成的封闭图形叫做这个点阵的“最大生成图”,用表示。(PS:这个名字是出题人胡诌的,如有雷同纯属巧合,出题人不负法律责任)
显然,任意一个点阵都有“最大生成图”,并且有的点阵的“最大生成图”不止一个。
如图为3*3的矩阵的一个最大生成图:
给你一个M*N的点阵和一个三角形,问你是否可以通过若干次裁剪、拼接操作,使其某一个“最大生成图”成为该三角形?如果可以,请输出“Yes”(不含引号),否则请输出“No”。
在本题中,M*N的点阵内,相邻两点间的距离为1(上下相邻和左右相邻),为了简便,给定三角形的两个顶点,第三个顶点是原点。
由于Apojacsleam的计算几何往往被精度卡飞,所以他痛恨精度错误,于是给定的数字都是整数。
输入描述:
输入数据有多组:
每组输入数据两行,第一行两个正整数M,N,第二行四个整数x1,y1,x2,y2,描述一个三角形数据不保证能够形成三角形。
输出描述:
对于每组输入数据,输出一行描述答案:“Yes”或“No”
示例1
说明
样例解释:
波尔约-格维也纳定理:
任意两个面积相等的多边形,它们可以相互拼接得到
匹克公式:
AC代码:
#include <map> #include <set> #include <stack> #include <cmath> #include <queue> #include <cstdio> #include <vector> #include <string> #include <bitset> #include <cstring> #include <iomanip> #include <iostream> #include <algorithm> #define ls (r<<1) #define rs (r<<1|1) #define debug(a) cout << #a << " " << a << endl using namespace std; typedef long long ll; const ll maxn = 1e6+10; const double eps = 1e-8; const ll mod = 1e9 + 7; const int inf = 0x3f3f3f3f; const double pi = acos(-1.0); struct point { double x, y; }; double cal( point a, point b, point c ) { return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y); } double cal_area( point a, point b, point c ) { return fabs(cal(a,b,c)/2); } int main() { ios::sync_with_stdio(0); point a, b, c; a.x = a.y = 0; ll n, m; while( cin >> n >> m ) { cin >> b.x >> b.y >> c.x >> c.y; double s1 = 1.0*n*m/2.0 - 1; double s2 = cal_area(a,b,c); if( s1 == s2 ) { cout << "Yes" << endl; } else { cout << "No" << endl; } } return 0; }