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
",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
",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
",4*ans);
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/XDJjy/p/3328981.html