hdu 4739 Zhuge Liang's Mines
#include<stdio.h> #include<algorithm> using namespace std; #define Max 40 struct Node { int x,y; bool flag; } p[Max]; bool cmp(Node p1, Node p2) { if(p1.y<p2.x)return true; if(p1.y==p2.y&&p1.x<p2.x)return true; return false; } int Judge(Node p1,Node p2,Node p3,Node p4) { if(p1.x==p3.x&&p2.x==p4.x&&p1.y==p2.y&&p3.y==p4.y) { if(p4.y-p2.y==p4.x-p3.x) return true;; } return false; } /* bool cmp(node a,node b) { if(a.x < b.x) return true; if(a.x == b.x) if(a.y < b.y) return true; return false; } bool Judge(Node a,Node b,Node c,Node d) { if(a.x == b.x && c.x == d.x) { if(a.y == c.y && b.y == d.y) { if(b.y-a.y==c.x-a.x)return true; } } return false; }*/ int main() { int n,i,j,k,l; while(scanf("%d",&n)!=EOF&&n!=-1) { for(i=0; i<n; i++) { scanf("%d %d",&p[i].x,&p[i].y); p[i].flag=true; } sort(p,p+n,cmp); //for(i=0;i<n;i++) //printf("#%d %d\n",p[i].x,p[i].y); int ans=0,x=0; for(i=0; i<n; i++) for(j=i+1; j<n; j++) for(k=j+1; k<n; k++) for(l=k+1; l<n; l++) if(p[i].flag&&p[j].flag&&p[k].flag&&p[l].flag) { if(Judge(p[i],p[j],p[k],p[l])) { x+=4; p[i].flag=false; p[j].flag=false; p[k].flag=false; p[l].flag=false; } } printf("%d\n",x); } return 0; }
Q1:为什么按x排序就过,按y排序过不了?
Q2:虐心的暴搞啊!有点贪心的意思(找最近的四点构成的正方形)、
搜索:
#include<stdio.h> #include<algorithm> using namespace std; #define Max 40 struct Node { int x,y; bool flag; }p[Max]; /*bool cmp(Node p1,Node p2) { if(p1.x<p2.x)return true; if(p1.x==p2.x&&p1.y<p2.y)return true; return false; }*/ bool cmp(Node p1,Node p2) { if(p1.y<p2.y)return true; if(p1.y==p2.y&&p1.x<p2.x)return true; return false; } int n,ans; int Check(int x,int y) { for(int i=0;i<n;i++) if(p[i].flag&&p[i].x==x&&p[i].y==y)return i; return -1; } void Dfs(int num) { int i,j; if(num>ans) ans=num; for(i=0;i<n;i++) { if(p[i].flag) { for(j=i+1;j<n;j++) if(p[j].flag) { if(p[j].x-p[i].x==p[j].y-p[i].y&&p[i].x!=p[j].x) { int k=Check(p[i].x,p[j].y); int l=Check(p[j].x,p[i].y); if(k!=-1&&l!=-1) { p[i].flag=false; p[j].flag=false; p[k].flag=false; p[l].flag=false; Dfs(num+1); p[i].flag=true; p[j].flag=true; p[k].flag=true; p[l].flag=true; } } } } } } int main() { int i; while(scanf("%d",&n)!=EOF&&n!=-1) { for(i=0;i<n;i++) { scanf("%d %d",&p[i].x,&p[i].y); p[i].flag=true; } sort(p,p+n,cmp); ans=0; Dfs(0); printf("%d\n",4*ans); } return 0; }