zoukankan      html  css  js  c++  java
  • HDU 2013 ACM/ICPC Asia Regional Hangzhou Online ------ Zhuge Liang's Mines

    http://acm.hdu.edu.cn/showproblem.php?pid=4739

    这题是dfs,只需一个一个搜就可以了

    #include<stdio.h>
    #include<math.h>
    #include<stdlib.h>
    struct node
    {
        int x,y;
    }s[50];
    int N,ans,v[50];
    int cmp(const void *a,const void *b)
    {
        struct node *c=(struct node *)a;
        struct node *d=(struct node *)b;
        if(c->y==d->y)
            return c->x>d->x;
        else return c->y>d->y;
    }
    void dfs(int num,int sum)/*num记录点的位置,sum记录总共可以移动的地雷数量*/
    {
        int i,j,cut,n1,n2;
        if(ans<sum)ans=sum;
        for(i=num;i<N;i++)
        {
            if(v[i])continue;
            v[i]=1;
            for(j=i+1;j<N;j++)
            {
                if(v[j]||s[i].x!=s[j].x||s[i].y==s[j].y)
                    continue;
                v[j]=1;
                cut=abs(s[j].y-s[i].y);
                for (n1=0;n1<N;n1++)
                    if (s[n1].x==s[i].x+cut && s[n1].y==s[i].y && !v[n1]) break;//找到对应的那个是否存在
                if (n1==N)
                {
                    v[j]=0;
                    continue;
                }
                v[n1]=1;
                for (n2=0;n2<N;n2++)
                    if (s[n2].x==s[j].x+cut && s[n2].y==s[j].y && !v[n2]) break;
                if (n2==N)
                {
                    v[j]=v[n1]=0;
                    continue;
                }
                    v[n2]=1;
                    dfs(i+1,sum+4);
                    v[j]=v[n1]=v[n2]=0;
            }
            v[i]=0;
        }
    }
    int main()
    {
        int i,j;
        struct node temp;
        while(scanf("%d",&N),N!=-1)
        {
            for(i=0;i<N;i++)
                v[i]=0;
            for(i=0;i<N;i++)
                scanf("%d%d",&s[i].x,&s[i].y);
            /*qsort(s,N,sizeof(s[0]),cmp);*/
            /*for(i=0;i<N-1;i++)
            {
                for(j=i;j<N-1;j++)
                    if(s[j].y>s[j+1].y)
                    temp=s[j],s[j]=s[j+1],s[j+1]=temp;
                    else if(s[j].y==s[j+1].y&&s[j].x>s[j+1].x)
                    temp=s[j],s[j]=s[j+1],s[j+1]=temp;
            }*/
            /*for(i=0;i<N;i++)
                printf("(%d,%d)
    ",s[i].x,s[i].y);*/
            ans=0;
            dfs(0,0);
            printf("%d
    ",ans);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    关于这个 blog
    P6499 [COCI2016-2017#2] Burza 题解
    CF1172F Nauuo and Bug 题解
    CF1479D Odd Mineral Resource 题解
    CF1442E Black, White and Grey Tree 题解
    CF1442D Sum 题解
    CF1025D Recovering BST 题解
    CF1056E Check Transcription 题解
    CF1025F Disjoint Triangles 题解
    红包算法的PHP实现
  • 原文地址:https://www.cnblogs.com/huzhenbo113/p/3331030.html
Copyright © 2011-2022 走看看