题目地址:
http://acm.hdu.edu.cn/showproblem.php?pid=5365
题目:
4 0 0 0 1 1 0 1 1
1
给你几个整数点,找出这几个点所组成的正N边型,因为所有的点都是整数的,所以只需要判断是否为正四边形。
思路
我的做法是判断组成图形的4条边相互垂直且相等
#include<stdio.h> #include <cstring> #include <algorithm> #include <iostream> #include <string> using namespace std; typedef long long ll; int n; struct Point { int x,y; }p[25]; int dis2(Point a,Point b)//用来判断两点距离 { return (a.x -b.x)*(a.x - b.x) + (a.y - b.y)*(a.y-b.y); } int chaji(Point a,Point b,Point c)//求两条直线的叉积 { return (a.x-b.x)*(c.x-b.x) + (a.y-b.y)*(c.y-b.y); } bool ok(Point a,Point b,Point c)//判断两条边是否垂直且相等 { if(chaji(a,b,c) == 0 && dis2(a,b) == dis2(b,c)) return true; return false; } int main() { while(scanf("%d",&n) != EOF) { int a,b; for(int i=0;i<n;i++) { scanf("%d%d",&p[i].x,&p[i].y); } ll ans = 0; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(j == i) continue; for(int k=0;k<n;k++) { if(k == i || k == j) continue; for(int q=0;q<n;q++) { if(q == i ||q == j || q == k) continue; Point a = p[i]; Point b = p[j]; Point c = p[k]; Point d = p[q]; if(ok(a,b,c) && ok(b,c,d) && ok(c,d,a) && ok(d,a,b)) { ans ++; } } } } } printf("%I64d\n",ans/8 );//因为平时是4,正逆两个方向,所以除以8 } //while(1); }