zoukankan      html  css  js  c++  java
  • hdu4536 水搜索

    题意:

    XCOM Enemy Unknown

    Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
    Total Submission(s): 814 Accepted Submission(s): 242


    Problem Description
    XCOM-Enemy Unknown是一款很好玩很经典的策略游戏.
    在游戏中,由于未知的敌人--外星人入侵,你团结了世界各大国家进行抵抗.


    随着游戏进展,会有很多的外星人进攻事件.每次进攻外星人会选择3个国家攻击,作为联盟的指挥者,你要安排有限的联盟军去支援其中一个国家,抵抗进攻这个国家的外星人.



    战斗胜利之后这个被支援的国家恐慌值就会-2点(恐慌值最少减为1),而其他两个未被支援的国家恐慌值就会+2点,同时和这两个国家在相同大洲的其他国家恐慌值也会+1点.
    当一个国家的恐慌值超过5点,这个国家就会对联盟失去信心从而退出联盟.
    现在给你外星人将会进攻的地点,问你最多能在不失去任何一个国家信任的情况下抵挡多少次外星人的进攻.

    Input
    第一行有一个整数T代表接下来有T组数据
    每组数据第一行是三个整数,n,m,k分别代表联盟国家的个数,大洲的个数,外星人的进攻次数.
    第二行是n个数字代表各个国家所属的大洲(大洲序号从0到m-1)
    第三行是n个数字代表各个国家初始的恐慌值
    接下去k行代表外星人进攻
    每行有三个数字,表示该次外星人进攻的国家(国家序号从0到n-1)

    [Technical Specification]
    0<T<=100
    8<n<=16
    2<m<=5
    0<k<=100
    0<初始恐慌值<=5
    每个州至少有三个国家
    每次外星人进攻一定发生在不同州的三个国家

    Output
    首先输出case数(见sample),接着输出在不失去任何一个国家的情况下能抵挡外星人进攻最多的次数.

    Sample Input
    1 9 3 2 0 0 0 1 1 1 2 2 2 3 3 3 3 3 3 3 3 3 0 3 6 0 3 6

    Sample Output
    Case #1: 1
    Hint
    第一次如果选择了0,那么3和6的恐慌值就会增加到5,第二次不管怎么选择,3和6总会有一个超过5.
    思路:       暴搜时间过得去,数据很小,每次分三种情况就行了..
    #include<stdio.h>
    #include<string.h>
    
    #define N 20
    
    typedef struct
    {
       int hp ,zhou;
    }NODE;
    
    typedef struct
    {
       int a ,b ,c;
    }Q;
    
    int Z[10][N];
    NODE node[N];
    Q qq[105];
    
    int max_ans;
    int K ,n;
    
    void DFS(int deep)
    {
       if(max_ans < deep) max_ans = deep;
       if(deep == K + 1) return ;
       
       int a = qq[deep].a;
       int b = qq[deep].b;
       int c = qq[deep].c;
       
       //1
       NODE mk_node[N]; 
       int i;
       for(i = 1 ;i <= n ;i ++)
       mk_node[i] = node[i]; 
       node[a].hp -= 2;
       if(node[a].hp < 1) node[a].hp = 1;
       node[b].hp += 1,node[c].hp += 1;
       for(i = 1 ;i <= Z[node[b].zhou][0] ;i ++)
       node[Z[node[b].zhou][i]].hp ++;
       for(i = 1 ;i <= Z[node[c].zhou][0] ;i ++)
       node[Z[node[c].zhou][i]].hp ++;
       for(i = 1 ;i <= n ;i ++)
       if(node[i].hp > 5) break;
       if(i == n + 1 && max_ans != K + 1)
       DFS(deep + 1);
       for(i = 1 ;i <= n ;i ++)
       node[i] = mk_node[i];
       
        //2
       for(i = 1 ;i <= n ;i ++)
       mk_node[i] = node[i]; 
       node[b].hp -= 2;
       if(node[b].hp < 1) node[b].hp = 1;
       node[a].hp += 1,node[c].hp += 1;
       for(i = 1 ;i <= Z[node[a].zhou][0] ;i ++)
       node[Z[node[a].zhou][i]].hp ++;
       for(i = 1 ;i <= Z[node[c].zhou][0] ;i ++)
       node[Z[node[c].zhou][i]].hp ++;
       for(i = 1 ;i <= n ;i ++)
       if(node[i].hp > 5) break;
       if(i == n + 1 && max_ans != K + 1)
       DFS(deep + 1);
       for(i = 1 ;i <= n ;i ++)
       node[i] = mk_node[i];
       
       //3
       for(i = 1 ;i <= n ;i ++)
       mk_node[i] = node[i]; 
       node[c].hp -= 2;
       if(node[c].hp < 1) node[c].hp = 1;
       node[a].hp += 1,node[b].hp += 1;
       for(i = 1 ;i <= Z[node[a].zhou][0] ;i ++)
       node[Z[node[a].zhou][i]].hp ++;
       for(i = 1 ;i <= Z[node[b].zhou][0] ;i ++)
       node[Z[node[b].zhou][i]].hp ++;
       for(i = 1 ;i <= n ;i ++)
       if(node[i].hp > 5) break;
       if(i == n + 1 && max_ans != K + 1)
       DFS(deep + 1);
       for(i = 1 ;i <= n ;i ++)
       node[i] = mk_node[i];
    }
    
    int main ()
    {
       int i ,j ,m ,t ,cas = 1;
       int a;
       scanf("%d" ,&t);
       while(t--)
       {
          scanf("%d %d %d" ,&n ,&m ,&K);
          memset(Z ,0 ,sizeof(Z));
          for(i = 1 ;i <= n ;i ++)
          {
             scanf("%d" ,&node[i].zhou);
             node[i].zhou ++;        
             Z[node[i].zhou][0]++;
             Z[node[i].zhou][Z[node[i].zhou][0]] = i;
          }
          for(i = 1 ;i <= n ;i ++)
          scanf("%d" ,&node[i].hp);
          for(i = 1 ;i <= K ;i ++)
          {
             scanf("%d %d %d" ,&qq[i].a ,&qq[i].b ,&qq[i].c);
             qq[i].a ++ ,qq[i].b ++ ,qq[i].c ++;
          }
          max_ans = 1;
          DFS(1);
          printf("Case #%d: %d
    " ,cas ++ ,max_ans - 1);
       }
       return 0;
    }
             
    

  • 相关阅读:
    Solution: Win 10 和 Ubuntu 16.04 LTS双系统, Win 10 不能从grub启动
    在Ubuntu上如何往fcitx里添加输入法
    LaTeX 笔记---Q&A
    Hong Kong Regional Online Preliminary 2016 C. Classrooms
    Codeforces 711E ZS and The Birthday Paradox
    poj 2342 anniversary party
    poj 1088 滑雪
    poj 2479 maximum sum
    poj 2481 cows
    poj 2352 stars
  • 原文地址:https://www.cnblogs.com/csnd/p/12063140.html
Copyright © 2011-2022 走看看