hdu 4536 XCOM Enemy Unknown(搜索)
2016-06-30 13:09
267 查看
XCOM Enemy Unknown
Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1108 Accepted Submission(s): 333
Problem Description
XCOM-Enemy Unknown是一款很好玩很经典的策略游戏.
在游戏中,由于未知的敌人--外星人入侵,你团结了世界各大国家进行抵抗.
![](http://acm.hdu.edu.cn/data/images/4536-1.jpg)
随着游戏进展,会有很多的外星人进攻事件.每次进攻外星人会选择3个国家攻击,作为联盟的指挥者,你要安排有限的联盟军去支援其中一个国家,抵抗进攻这个国家的外星人.
![](http://acm.hdu.edu.cn/data/images/4536-2.jpg)
战斗胜利之后这个被支援的国家恐慌值就会-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 <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define N 1100
int a
,b
;
int d
[3];
int maxn,n,m,k;
void dfs(int v)
{
if(v>k)
{
maxn=k;
return;
}
for(int i=0; i<3; i++)
{
int w=b[d[v][i]],flag=0;
b[d[v][i]]>2?b[d[v][i]]-=2:b[d[v][i]]=1;
for(int j=0; j<3; j++)
{
if(j==i) continue;
if(b[d[v][j]]>3)
{
maxn=max(maxn,v-1);
flag=1;
break;
}
}
if(flag) {b[d[v][i]]=w;continue;}
for(int j=0; j<3; j++)
{
if(j!=i)
for(int l=0; l<n; l++)
if(l!=d[v][j]&&a[l]==a[d[v][j]]&&b[l]>4)
{
maxn=max(maxn,v-1);
flag=1;
break;
}
}
if(flag) {b[d[v][i]]=w;continue;}
else
{
for(int j=0; j<3; j++)
if(j!=i)
b[d[v][j]]+=2;
for(int j=0; j<3; j++)
{
if(j!=i)
for(int l=0; l<n; l++)
if(l!=d[v][j]&&a[l]==a[d[v][j]])
b[l]++;
}
}
dfs(v+1);
for(int j=0; j<3; j++)
if(j!=i)
b[d[v][j]]-=2;
for(int j=0; j<3; j++)
{
if(j!=i)
for(int l=0; l<n; l++)
if(l!=d[v][j]&&a[l]==a[d[v][j]])
b[l]--;
}
b[d[v][i]]=w;
}
}
int main()
{
int T;
int q,w,e;
scanf("%d",&T);
for(int t=1; t<=T; t++)
{
scanf("%d %d %d",&n,&m,&k);
for(int i=0; i<n; i++)
scanf("%d",&a[i]);
for(int i=0; i<n; i++)
scanf("%d",&b[i]);
for(int i=1; i<=k; i++)
scanf("%d %d %d",&d[i][0],&d[i][1],&d[i][2]);
maxn=0;
dfs(1);
printf("Case #%d: %d\n",t,maxn);
}
return 0;
}
相关文章推荐
- nagios邮件告警设置方法成功版本
- Xcode7 安装VVDocumenter-Xcode步骤
- Python学习笔记
- asp.net MD5 加密
- [第三方工具]利用第三方工具xPort导出Excel文件
- 1-2数据库管理技术
- 『零行代码』解决键盘遮挡问题(iOS)
- 离婚后感言
- 执行SVN cleanup 反复失败
- hdu 4544 湫湫系列故事——消灭兔子(贪心,优先队列)
- 1-1数据库系统相关概念
- server2008服务器IIS7 +PHP5.3出现500错误的排错方法
- swiper的基础教程(十二)
- 4最短路径之村庄4
- sql语句技巧--插入时间时非必填的情况
- Android Studio根据apk获取Sha1值
- [阶段总结一]感悟
- Swift ☞ OC调用
- ASP.NET程序中设置相对路径的方法
- ASP.NET程序中设置相对路径的方法