POJ 2954 Triangle [pick定理,叉积,计算几何]

Posted 霜序0.2℃

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 2954 Triangle [pick定理,叉积,计算几何]相关的知识,希望对你有一定的参考价值。

题目

Triangle

Time Limit: 1000MSMemory Limit: 65536K
Total Submissions: 7044Accepted: 2966

Description

A lattice point is an ordered pair (x, y) where x and y are both integers. Given the coordinates of the vertices of a triangle (which happen to be lattice points), you are to count the number of lattice points which lie completely inside of the triangle (points on the edges or vertices of the triangle do not count).

Input

The input test file will contain multiple test cases. Each input test case consists of six integers x1, y1, x2, y2, x3, and y3, where (x1, y1), (x2, y2), and (x3, y3) are the coordinates of vertices of the triangle. All triangles in the input will be non-degenerate (will have positive area), and −15000 ≤ x1, y1, x2, y2, x3, y3 ≤ 15000. The end-of-file is marked by a test case with x1 = y1 = x2 = y2 = x3 = y3 = 0 and should not be processed.

Output

For each input case, the program should print the number of internal lattice points on a single line.

Sample Input

0 0 1 0 0 1
0 0 5 0 0 5
0 0 0 0 0 0

Sample Output

0
6

解释与代码

题意,给你三角形的三个点,求在这个三角形中的格点的数量

我们需要用到pick定理,这个定理不只用于三角形,多边形都可以

简单解释,即S=a+b/2-1,S是三角形面积,a是内部的格点,b是边上的格点

S可以通过叉积直接求,边上的格点数量可以通过gcd(|x|,|y|)求出来

为什么不用模板呢,因为模板上的double类型的,改来改去就是不对

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
#include <iostream>
#include <sstream>
#include <set>
#include <map>
#include <queue>
#include <bitset>
#include <vector>
#include <limits.h>
#include <assert.h>
#include <functional>
#include <numeric>
#include <ctime>
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>
#define pb          push_back
#define ppb         pop_back
#define lbnd        lower_bound
#define ubnd        upper_bound
#define endl        '\\n'
#define trav(a, x)  for(auto& a : x)
#define all(a)      (a).begin(),(a).end()
#define F           first
#define S           second
#define sz(x)       (ll)x.size()
#define hell        1000000007
#define DEBUG       cerr<<"/n>>>I'm Here<<</n"<<endl;
#define display(x)  trav(a,x) cout<<a<<" ";cout<<endl;
#define what_is(x)  cerr << #x << " is " << x << endl;
#define ini(a)      memset(a,0,sizeof(a))
#define case        ll T;read(T);for(ll Q=1;Q<=T;Q++)
#define lowbit(x)   x&(-x)
#define pr          printf
#define sc          scanf
//#define _           0
#define FAST ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define DBG(x) \\
    (void)(cout << "L" << __LINE__ \\
    << ": " << #x << " = " << (x) << '\\n')
#define TIE \\
    cin.tie(0);cout.tie(0);\\
    ios::sync_with_stdio(false);
//#define long long int

//using namespace __gnu_pbds;


using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const double pi    = acos(-1.0);
const double eps   = 1e-8;
const int    INF   = 0x3f3f3f3f;
const ll     LLINF = 0x3f3f3f3f3f3f3f3f;
const int    maxn  = 200009;
const ll     N     = 5;

const double inf=1e20;
const int maxp=1010;

//判断正负
int sgn(double x) {
	if (fabs(x)<eps) return 0;
	if (x<0) return -1;
	else return 1;
}
//平方
inline double sqr(double x) {
	return x*x;
}




inline int gcd(int a,int b) {
    return b>0 ? gcd(b,a%b):a;
}



void solve(){
	int a, b, c, d, e, f;
	while(cin>>a>>b>>c>>d>>e>>f) {
		if (a==b&&b==c&&c==d&&d==e&&e==f&&f==0) break;
		int ea = abs((c-a)*(f-b) - (d-b)*(e-a));
		int q = gcd(abs(c-a),abs(b-d)) + gcd(abs(c-e),abs(d-f)) + gcd(abs(e-a), abs(f-b));
		cout<<(ea-q+2)/2<<endl;
	}
}


int main()
{
//	TIE;
    #ifndef ONLINE_JUDGE
//    freopen ("in.txt" , "r", stdin );
//    freopen ("out.txt", "w", stdout);
    #else
    #endif
	solve();
//    case{solve();}
//    case{cout<<"Case "<<Q<<":"<<endl;solve();}
//	return ~~(0^_^0);
}

参考:https://blog.csdn.net/clove_unique/article/details/53982212

以上是关于POJ 2954 Triangle [pick定理,叉积,计算几何]的主要内容,如果未能解决你的问题,请参考以下文章

poj2954Triangle

poj2954 Triangle

POJ 2954 /// 皮克定理+叉积求三角形面积

poj1265&&2954 [皮克定理 格点多边形]学习笔记

poj 1265 Area(Pick定理)

poj 1265 Area Pick定理