• 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
  • 相关阅读:
    IOS-多线程技术
    设计模式-抽象工厂设计模式
    IOS-内存管理
    IOS-MVC的使用
    POJ2411 Mondriaan's Dream (广场铺砖问题 状压dp)
    NOIp2006T2 金明的预算方案
    POJ1179 Polygon(区间DP)
    NOIp2006T1能量项链
    美梦1(JSOI2014SC)
    TJOI2013(BZOJ3173)最长上升子序列
  • 原文地址:https://www.cnblogs.com/huzhenbo113/p/3331030.html
Copyright © 2020-2023  润新知