您的位置:首页 > 其它

XCOM Enemy Unknown 简单的dfs() 枚举就行,不过有个用二进制压缩的没看懂

2013-11-09 19:55 393 查看
[align=left]Problem Description[/align]
XCOM-Enemy Unknown是一款很好玩很经典的策略游戏.
在游戏中,由于未知的敌人--外星人入侵,你团结了世界各大国家进行抵抗.

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<vector>
using namespace std;
int st[1001],fear[1001];
int cas,ans;
int n,m,k,i,j;
bool flag;
struct node
{
int a[3];
}fi[1001];//此处还可用二维数组
vector<int>mvy[6];
void dfs(int cur,int *afr)
{
if(flag)//剪枝
return;
for(int it=0;it<n;it++)//剪枝
{
if(afr[it]>5)
{
ans=max(ans,cur-2);
return;
}
}
if(cur>k)//剪枝
{
flag=true;
ans=k;
return;
}
int tmp[20];//为了保持原始数据,(其实就是还原)
for(int it=0;it<3;it++)//考虑3种情况
{
for(int jt=0;jt<n;jt++)
tmp[jt]=afr[jt];
tmp[fi[cur].a[it]]-=2;
if(tmp[fi[cur].a[it]]<1)//此处必须判断
tmp[fi[cur].a[it]]=1;
for(int jt=1;jt<=2;jt++)
{
int k=(it+jt)%3;
int sta=st[fi[cur].a[k]];
for(int kt=0;kt<mvy[sta].size();kt++)
{
tmp[mvy[sta][kt]]+=1;
}
tmp[fi[cur].a[k]]+=1;

}
dfs(cur+1,tmp);
}

}
int main()
{
scanf("%d",&cas);
int ca=0;
while(cas--)
{
++ca;
scanf("%d%d%d",&n,&m,&k);
for(i=0;i<m;i++)
mvy[i].clear();
for(i=0;i<n;i++)
{
scanf("%d",&st[i]);
mvy[st[i]].push_back(i);
}
for(i=0;i<n;i++)
scanf("%d",&fear[i]);
for(i=1;i<=k;i++)
for(j=0;j<3;j++)
{
scanf("%d",&fi[i].a[j]);
}
ans=0;
flag=false;
dfs(1,fear);
printf("Case #%d: %d\n",ca,ans);
}
return 0;
}
//其实就是枚举


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: