HDU-4536 XCOM Enemy Unknown(dfs暴搜)

题目链接


#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=20,maxk=105;
int n,m,k;
struct node
{
    int num,sca;
};
node s[maxn];
int a[maxk][3];
int ans;

void dfs(int num)
{
    //ans=max(ans,num);
    if(num==k)
    {
        ans=k;
        return ;
    }
    for(int i=0;i<3;i++) //枚举每次被攻击的国家
    {
        int n1=a[num][i],n2=a[num][(i+1)%3],n3=a[num][(i+2)%3];//n1,n2,n3分别表示每次被攻击的国家编号,n1为被支援国家
        int t1=s[n1].sca,t2=s[n2].sca,t3=s[n3].sca;   //备份每次攻击前这三个国家的恐慌值
        s[n1].sca-=2;
        if(s[n1].sca<1) s[n1].sca=1;
        s[n2].sca+=2;   s[n3].sca+=2;
        for(int j=0;j<n;j++)
        {
            if(j==n2||j==n3) continue;
            if(s[j].num==s[n2].num||s[j].num==s[n3].num) s[j].sca+=1;
        }
        bool flag=true;//状态变量,标记是否继续搜索下去
        for(int j=0;j<n;j++)
        {
            if(s[j].sca>5)
            {
                ans=max(num,ans);
                flag=false;
            }
        }
        if(flag) dfs(num+1);
        s[n1].sca=t1;   s[n2].sca=t2;   s[n3].sca=t3;
        for(int j=0;j<n;j++)
        {
            if(j==n2||j==n3) continue;
            if(s[j].num==s[n2].num||s[j].num==s[n3].num) s[j].sca-=1;
        }          //重置各个国家的恐慌值
    }
}
int main()
{
    int T;
    cin>>T;
    int cnt=1;
    while(T--)
    {
        ans=0;
        scanf("%d%d%d",&n,&m,&k);
        for(int i=0;i<n;i++)
            scanf("%d",&s[i].num);
        for(int i=0;i<n;i++)
            scanf("%d",&s[i].sca);
        for(int i=0;i<k;i++)
            scanf("%d%d%d",&a[i][0],&a[i][1],&a[i][2]);
        dfs(0);
        printf("Case #%d: %d\n",cnt++,ans);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值