您的位置:首页 > 其它

爆搜

2016-07-18 20:44 316 查看
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

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#define maxn 1009
using namespace std;
vector<int> G[10];
int z[maxn],val[maxn];
int n,m,k,ans;
struct attack
{
int x,y,z;
attack(int a=0,int b=0,int c=0):x(a),y(b),z(c) {}
} ak[109];
bool fun(int zz,int index)
{
for(int i=0;i<G[zz].size();i++)
{
if(G[zz][i]==index)
val[index]+=2;
else
val[G[zz][i]]+=1;
if(val[G[zz][i]]>5)
return false;
}
return true;
}
void dfs(int step)
{
ans=max(ans,step);
if(step>=k)
return;
int tmp[maxn];
for(int i=0; i<n; i++)
tmp[i]=val[i];
int a=ak[step].x,b=ak[step].y,c=ak[step].z;
val[a]-=2;
if(val[a]<1) val[a]=1;
if(fun(z[b],b)&&fun(z[c],c)) dfs(step+1);
for(int i=0;i<n;i++) val[i]=tmp[i];
val[b]-=2;
if(val[b]<1) val[b]=1;
if(fun(z[a],a)&&fun(z[c],c)) dfs(step+1);
for(int i=0;i<n;i++) val[i]=tmp[i];
val[c]-=2;
if(val[c]<1) val[c]=1;
if(fun(z[a],a)&&fun(z[b],b)) dfs(step+1);
for(int i=0;i<n;i++) val[i]=tmp[i];
}
int main()
{
int t;
cin>>t;
for(int ase=1; ase<=t; ase++)
{
for(int j=0; j<6; j++)
G[j].clear();
cin>>n>>m>>k;
for(int i=0; i<n; i++)
{
cin>>z[i];
G[z[i]].push_back(i);
}
for(int i=0; i<n; i++)
cin>>val[i];
for(int i=0; i<k; i++)
{
int a,b,c;
cin>>a>>b>>c;
ak[i]=attack(a,b,c);
}
ans=0;
dfs(0);
printf("Case #%d: %d\n",ase,ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: