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;
    }
             
    

  • 相关阅读:
    golang删除数组某个元素
    golang用通道实现信号量,控制并发个数
    什么是ScaleIO中的forwards rebuild和backwards rebuild?
    SQL Server中的database checkpoint
    如何将thick provision lazy zeroed的VMDK文件转换为thick provision eager zeroed?
    LoadTestAgentResultsLateException in VS2010
    SQL Server Instance无法启动了, 因为TempDB所在的分区没有了, 怎么办?
    VMware vCenter中, 如何辩认虚机上Raw Device Mapping过了的一块物理磁盘?
    SQL Server AlwaysOn Setup Step-By-Step Guide
    TPC-E在populate测试Database时需要注意的一些事项
  • 原文地址:https://www.cnblogs.com/csnd/p/12063139.html
Copyright © 2011-2022 走看看