您的位置:首页 > 编程语言 > Go语言

HDU 4739 Zhuge Liang's Mines (2013 ACM/ICPC Asia Regional Hangzhou Online)

2013-09-15 22:42 537 查看
//由于构成的正方形的边要平行于坐标轴 当点数为25时正方形最多为30个  而题目n<=20说明正方形最多不超过30  先暴力出所有正方形,接着暴力搜下就可以。
 
 
 
#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<cmath>#define max(x,y) ((x)>(y)?(x):(y))using namespace std;struct Tpoint{int x, y;void in(){scanf("%d%d", &x, &y);}} p[30];Tpoint operator-(Tpoint a, Tpoint b){Tpoint ret;ret.x = a.x - b.x;ret.y = a.y - b.y;return ret;}int dis(Tpoint a, Tpoint b){return ((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));}int dot(Tpoint a, Tpoint b){return a.x * b.x + a.y * b.y;}int cross(Tpoint a, Tpoint b){return a.x * b.y - a.y * b.x;}int a[10100];bool check(Tpoint a, Tpoint b, Tpoint c, Tpoint d){if (dis(a, b) != dis(b, c) || dis(b, c) != dis(c, d) || dis(c, d) != dis(d,a))return false;if (a.y == b.y && b.x == c.x && c.y == d.y && d.x == a.x)return true;return false;}int tail,ans;void gao(int now,int num){if(now==6)return;ans=max(now*4,ans);int i;for(i=0;i<tail;i++){if((num&a[i])==0)gao(now+1,num|a[i]);}}int main(){int i, j, k, n, m, l;while (scanf("%d", &n) && n != -1){ans=0;tail = 0;for (i = 0; i < n; i++)p[i].in();for (i = 0; i < n; i++){for (j = 0; j < n; j++){if (i == j)continue;for (k = 0; k < n; k++){if (j == k || i == k)continue;for (l = 0; l < n; l++){if (i == l || j == l || k == l)continue;if (check(p[i], p[j], p[k], p[l]))a[tail++] = ((1 << i) + (1 << j) + (1 << k) + (1<< l));}}}}gao(0,0);printf("%d\n",ans);}}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C 算法 algorithm
相关文章推荐