题意:

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\n" ,cas ++ ,max_ans - 1);
}
return
0;
}

hdu4536 水搜索的更多相关文章

  1. hdu5012 水搜索

    题意:       给你一个正方体的初始状态和末状态,问你是否可以再6步之内转到这个状态,有四种转的方式,如果你面对的是正方向的正前方,那么转的方式就是 顺时针,逆时针,上,下. 思路:        ...

  2. P5198 [USACO19JAN]Icy Perimeter S (洛谷) (水搜索)

    同样是因为洛谷作业不会写…… 写(水)博客啦. 直接放题目吧,感觉放在代码框里好看点 Farmer John要开始他的冰激凌生意了!他制造了一台可以生产冰激凌球的机器,然而不幸的是形状不太规则,所以他 ...

  3. hdu1572 水搜索

    题意: 中文的不解释; 思路:           其实就是一个水的搜索,直接搜索不会超时,还有别跑最短路了,题目没要求跑最短路,别读错题,刚开始自己嘚嗖的跑了一边最短路 wa了 ,正好最近看了STL ...

  4. hdu4771 水搜索(状态压缩+bfs)

    题意:      给你一个n*m的地图,问你从起点出发,吧所有的宝藏都捡完用的最少时间. 思路:k <= 4,水题,直接开一个数组mark[now][x][y];now代表的是当前检宝藏的二进制 ...

  5. hdu 5094 Maze(水搜索)

    题目意思:说有一个人在(1,1) 他的目标点在(n,m) 每次是4方向的移动: 限制条件:有的各自之间有墙 或者门,强不可通过,有对应的要钥匙可以开启这个类型的所有门: 问题:求最少步骤数(和): 类 ...

  6. Divide by Zero 2017 and Codeforces Round #399 (Div. 1 + Div. 2, combined) A B 水 搜索

    A. Oath of the Night's Watch time limit per test 2 seconds memory limit per test 256 megabytes input ...

  7. hdu2102 水搜索

    题意:                                    A计划 Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次 ...

  8. hdu 2181 水搜索

    哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  9. Luogu P1141 01迷宫【搜索/dfs】By cellur925

    题目传送门 我tm到现在还需要刷这种水搜索...我退役吧. 但就是搜索弱嘛 补一补嘛qwq 题目大意:给你一张地图与许多询问,每次询问求这个点所在联通块的点的个数. 所以这个题目的本质就是在求联通块. ...

随机推荐

  1. 剑指 Offer 14- II. 剪绳子 II + 贪心 + 数论 + 快速幂

    剑指 Offer 14- II. 剪绳子 II 题目链接 因为有取模的操作,动态规划中max不能用了,我们观察:正整数从1开始,但是1不能拆分成两个正整数之和,所以不能当输入. 2只能拆成 1+1,所 ...

  2. 创建一个scrapy爬虫框架的项目

    第一步:打开pycharm,选择"terminal",如图所示: 第二步:在命令中端输入创建scrapy项目的命令:scrapy startproject demo (demo指的 ...

  3. 测试平台系列(4) 使用Flask蓝图(blueprint)

    使用Flask蓝图(blueprint) 回顾 先来看一下上一篇的作业吧,使用「logbook」的时候,遇到了时区不对的情况.那么我们怎么去解决这个问题呢? 实际上logbook默认采用的是世界标准时 ...

  4. 叫练手把手教你读JVM之GC信息

    案例 众所周知,GC主要回收的是堆内存,堆内存中包含年轻代和老年代,年轻代分为Eden和Surivor,如下图所示.我们用案例分析下堆的GC信息[版本:HotSpot JDK1.8]. /** * @ ...

  5. PHP并发抢购解决方案

    Mysql版 逻辑步骤 mysql存储引擎使用Innodb 开始事务,查询商品库存并加上共享锁 判断库存是否足够,进行商品/订单/用户等操作 提交事务,完成下单抢购 代码参考 // 关闭自动提交 $t ...

  6. Androidd Studio 之多行文字跑马灯特效

    •效果展示图 •参考资料 两种方法实现TextView跑马灯效果(字体横向滚动) •出现的问题 新建 Java 文件继承 TextView 时出现问题: •解决方法 不应该继承 $TextView$ ...

  7. Android 之 ToolBar 踩坑笔记

    写在前面 •前言 这两天,学完了 Fragment 的基础知识,正准备跟着<第一行代码>学习制作一个简易版的新闻应用: 嘀嘀嘀~~~ 一声消息传来,像往常一样,打开 QQ,当我看到 QQ ...

  8. 关于误删除elasticSearch 索引,怎么能快速找回?

    背景 之前公司小王在工作中清理elasticSearch 索引,不小心使用脚本清空了最近使用的重要索引,导致开发无法准确的进行定位生产问题,造成了很大困扰. 当时我们的生产环境中是这样配置日志系统的: ...

  9. 透视HTTP协议,带你拨开纷繁复杂的表象

    一个HTTP,打趴80%面试者! HTTP是一个在计算机世界里专门在两点之间传输文字.图片.音频.视频等超文本数据的约定和规范.如果你不懂HTTP协议,那就相当于是个只有半桶水的程序员. 在这个专栏中 ...

  10. Vim快速使用教程

    Vim Vim是从vi发展出来的一个文本编辑器.代码补完.编译及错误跳转等方便编程的功能特别丰富. Vi/Vim的使用 基本上分为三种模式,分别是命令模式(commad mode),输入模式(Inse ...