• HDOJ 4739 Zhuge Liang's Mines




    Zhuge Liang's Mines

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 831    Accepted Submission(s): 396


    Problem Description
    In the ancient three kingdom period, Zhuge Liang was the most famous and smartest military leader. His enemy was Shima Yi, who always looked stupid when fighting against Zhuge Liang. But it was Shima Yi who laughed to the end. 

    Once, Zhuge Liang sent the arrogant Ma Shu to defend Jie Ting, a very important fortress. Because Ma Shu is the son of Zhuge Liang's good friend Ma liang, even Liu Bei, the Ex. king, had warned Zhuge Liang that Ma Shu was always bragging and couldn't be used, Zhuge Liang wouldn't listen. Shima Yi defeated Ma Shu and took Jie Ting. Zhuge Liang had to kill Ma Shu and retreated. To avoid Shima Yi's chasing, Zhuge Liang put some mines on the only road. Zhuge Liang deployed the mines in a Bagua pattern which made the mines very hard to remove. If you try to remove a single mine, no matter what you do ,it will explode. Ma Shu's son betrayed Zhuge Liang , he found Shima Yi, and told Shima Yi the only way to remove the mines: If you remove four mines which form the four vertexes of a square at the same time, the removal will be success. In fact, Shima Yi was not stupid. He removed as many mines as possible. Can you figure out how many mines he removed at that time?

    The mine field can be considered as a the Cartesian coordinate system. Every mine had its coordinates. To simplify the problem, please only consider the squares which are parallel to the coordinate axes.
     

    Input
    There are no more than 15 test cases.
    In each test case:

    The first line is an integer N, meaning that there are N mines( 0 < N <= 20 ).

    Next N lines describes the coordinates of N mines. Each line contains two integers X and Y, meaning that there is a mine at position (X,Y). ( 0 <= X,Y <= 100)

    The input ends with N = -1.
     

    Output
    For each test case ,print the maximum number of mines Shima Yi removed in a line.
     

    Sample Input
    3
    1 1
    0 0
    2 2
    8
    0 0
    1 0
    2 0
    0 1
    1 1
    2 1
    10 1
    10 0
    -1
     

    Sample Output
    0
    4
     

    Source
     

    Recommend
    liuyiding
     
     
    状压DP
    四个点判断构成与坐标轴平行的正方形:
    选任意3个点,枚举3个顶点判断是否可以构成等腰直角三角形,如果可以判断能否与第4个点构成正方形。。。。。。。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <vector>

    using namespace std;

    struct node
    {
        int x,y;
    }p[30];

    int dp[1050000],n;
    vector<int> g[30];

    bool Judge(int i,int j,int k,int l)
    {
        node a=p,b=p[j],c=p[k],d=p[l];
        ///a-->d
        int x1=b.x-a.x,y1=b.y-a.y;
        int x2=c.x-a.x,y2=c.y-a.y;
        if(x1*x2-y1*y2==0)
        {
            int d1=x1*x1+y1*y1;
            int d2=x2*x2+y2*y2;
            if(d1==d2)
            {
                if((d.x==c.x&&d.y==b.y)||(d.x==b.x&&d.y==c.y))
                    return true;
            }
        }
        ///b-->d;
        x1=a.x-b.x,y1=a.y-b.y;
        x2=c.x-b.x,y2=c.y-b.y;
        if(x1*x2-y1*y2==0)
        {
            int d1=x1*x1+y1*y1;
            int d2=x2*x2+y2*y2;
            if(d1==d2)
            {
                if((d.x==c.x&&d.y==a.y)||(d.x==a.x&&d.y==c.y))
                    return true;
            }
        }
        ///c-->d
        x1=a.x-c.x,y1=a.y-c.y;
        x2=b.x-c.x,y2=b.y-c.y;
        if(x1*x2-y1*y2==0)
        {
            int d1=x1*x1+y1*y1;
            int d2=x2*x2+y2*y2;
            if(d1==d2)
            {
                if((d.x==b.x&&d.y==a.y)||(d.x==a.x&&d.y==b.y))
                    return true;
            }
        }
        return false;
    }
    int main()
    {
        while(scanf("%d",&n)&&~n)
        {
            for(int i=0;i<n;i++)
                scanf("%d%d",&p.x,&p.y);
            for(int i=0;i<30;i++)
                g.clear();
            memset(dp,0,sizeof(dp));
            for(int i=0;i<n;i++)
            {
                for(int j=i+1;j<n;j++)
                {
                    for(int k=j+1;k<n;k++)
                    {
                        for(int l=k+1;l<n;l++)
                        {
                            if(Judge(i,j,k,l))
                            {
                                int status=0;
                                status=status|(1<<i)|(1<<j)|(1<<k)|(1<<l);
                                g.push_back(status);
                            }
                        }
                    }
                }
            }
            for(int status=0;status<(1<<n);status++)
            {
                 for(int i=0;i<n;i++)
                 {
                     if(status&(1<<i))
                     {
                         for(int j=0;j<g.size();j++)
                         {
                             int s=g[j];
                             if((s|status)==status)
                             {
                                 dp[status]=max(dp[status],dp[status^s]+4);
                             }
                         }
                     }
                 }
            }
            printf("%d ",dp[(1<<n)-1]);
        }
        return 0;
    }
    * This source code was highlighted by YcdoiT. ( style: Codeblocks )





  • 相关阅读:
    cct,web技术
    cct信息安全
    TFS2010安装与管理
    centos7 opera济览器安装
    Hadoop 的常用组件一览
    Exception in thread "main" java.net.BindException: Address already in use: JVM_Bind
    gcc manual
    5350.support
    meminfo,df,
    WCF
  • 原文地址:https://www.cnblogs.com/CKboss/p/3350837.html
Copyright © 2020-2023  润新知