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
 
题意我就不说了
解析:刚开始看这题的时候以为要搜100层,岂不是爆了,然而。。。。。。其实根本到不了那么深,所以爆搜即可。
 
代码

#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#include<sstream>
#include<algorithm>
#include<utility>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<cmath>
#include<iterator>
#include<stack>
using namespace std;
const int INF=1e9+;
const double eps=1e-;
const int maxn=;
int N,M,K;
vector<int> G[maxn];
int bel[maxn],val[maxn],ans;
struct Atk
{
int x,y,z;
Atk(int x=,int y=,int z=):x(x),y(y),z(z){}
}atk[];
bool work(int a,int y)
{
for(int i=;i<G[a].size();i++)
{
int c=G[a][i];
if(c==y) val[c]+=;
else val[c]+=;
if(val[c]>) return false;
}
return true;
}
void dfs(int step)
{
ans=max(ans,step);
if(step>=K) return;
int B[maxn];
for(int i=;i<N;i++) B[i]=val[i];
Atk& t=atk[step];
int x=t.x,y=t.y,z=t.z;
val[x]-=;
if(val[x]<) val[x]=;
if(work(bel[y],y)&&work(bel[z],z)) dfs(step+);
for(int i=;i<N;i++) val[i]=B[i];
val[y]-=;
if(val[y]<) val[y]=;
if(work(bel[x],x)&&work(bel[z],z)) dfs(step+);
for(int i=;i<N;i++) val[i]=B[i];
val[z]-=;
if(val[z]<) val[z]=;
if(work(bel[x],x)&&work(bel[y],y)) dfs(step+);
for(int i=;i<N;i++) val[i]=B[i];
return;
}
int main()
{
int T,Case=;
scanf("%d",&T);
while(T--)
{
for(int i=;i<maxn;i++) G[i].clear();
scanf("%d%d%d",&N,&M,&K);
int x,y,z;
for(int i=;i<N;i++)
{
scanf("%d",&x);
bel[i]=x;
G[x].push_back(i);
}
for(int i=;i<N;i++) scanf("%d",&val[i]);
for(int i=;i<K;i++)
{
scanf("%d%d%d",&x,&y,&z);
atk[i]=Atk(x,y,z);
}
ans=;
dfs();
printf("Case #%d: %d\n",++Case,ans);
}
return ;
}


hdu4536-XCOM Enemy Unknown(爆搜)的更多相关文章

  1. HDU4536 XCOM Enemy Unknown(dfs)

    题目链接. 分析: 用dfs枚举每一波攻击的三个国家. 很暴力,但没想到0ms. #include <iostream> #include <cstdio> #include ...

  2. 【BZOJ-1853&2393】幸运数字&Cirno的完美算数教室 容斥原理 + 爆搜 + 剪枝

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 1817  Solved: 665[Submit][Status] ...

  3. POJ 1166 The Clocks (爆搜 || 高斯消元)

    题目链接 题意: 输入提供9个钟表的位置(钟表的位置只能是0点.3点.6点.9点,分别用0.1.2.3)表示.而题目又提供了9的步骤表示可以用来调正钟的位置,例如1 ABDE表示此步可以在第一.二.四 ...

  4. 【 POJ - 1204 Word Puzzles】(Trie+爆搜|AC自动机)

    Word Puzzles Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 10782 Accepted: 4076 Special ...

  5. hdu5323 Solve this interesting problem(爆搜)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Solve this interesting problem Time Limit ...

  6. poj1077 Eight【爆搜+Hash(脸题-_-b)】

    转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4298840.html   ---by 墨染之樱花 题目链接:http://poj.org/pr ...

  7. [NOIP2015] 斗地主 大爆搜

    考试的时候想了半天,实在是想不到解决的办法,感觉只能暴力..然后暴力也懒得打了,小数据模拟骗30分hhh 然而正解真的是暴力..大爆搜.. 然后我的内心拒绝改这道题(TAT) 不过在wcx大佬的帮助下 ...

  8. BZOJ 1207: [HNOI2004]打鼹鼠【妥妥的n^2爆搜,dp】

    1207: [HNOI2004]打鼹鼠 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3259  Solved: 1564[Submit][Statu ...

  9. HDU 4403 A very hard Aoshu problem(dfs爆搜)

    http://acm.hdu.edu.cn/showproblem.php?pid=4403 题意: 给出一串数字,在里面添加一个等号和多个+号,使得等式成立,问有多少种不同的式子. 思路: 数据量比 ...

随机推荐

  1. hdu1028:整数拆分

    求整数的拆分数.. 一种解法是母函数 #include <iostream> #include <stdio.h> #include<string.h> #incl ...

  2. Android 开机启动通知

    效果图: 学习: 1.静态注册实现开机启动 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLET ...

  3. ZooKeeper编程指导

    简介 对于想要利用ZooKeeper的协调服务来创建一个分布式应用的开发人员来说,这篇文章提供了指导.包含了一些概念和实际性操作的信息. 这篇文章的前四个章节介绍了各种ZooKeeper的概念,这对理 ...

  4. 深入浅出 消息队列 ActiveMQ

    http://blog.csdn.net/jwdstef/article/details/17380471

  5. javascript笔记5之流程控制语句

    /* var box = 100; //单行语句 var age = 20; //另一条单行语句 { //用花括号包含的语句集合,叫做复合语句,单位一个 //一对花括号,表示一个复合语句,处理时候,可 ...

  6. hdu 2817 A sequence of numbers(快速幂)

    Problem Description Xinlv wrote some sequences on the paper a long time ago, they might be arithmeti ...

  7. java常用方法

    public static int byte2int(byte b) { int i = b & 0x07f; if (b < 0) { i |= 0x80; } return i; } ...

  8. JS时间操作

    /** * 判断年份是否为润年 * * @param {Number} year */ function isLeapYear(year) { return (year % 400 == 0) || ...

  9. C#用注册表开机自动启动某某软件

    代码如下: public static void chkAutoRun(bool isRun) { if (isRun)//开机自动启动 { try { RegistryKey runKey = Re ...

  10. java基础之集合

    集合的定义,集合的应用,集合的分类,集合的遍历,集合的特性