hdu 4563XCOM Enemy Unknown dfs

/*
dfs枚举所有的进攻国家
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
#define maxn 20
#define maxm 10
#define maxk 110
struct node
{
    int belong;
    int panic;
}country[maxn];//每个国家的恐慌值和所属洲
int attack[3][maxk];//进攻的国家
vector<int> vec[maxm];//每一洲的国家
int n,m,K;
int change(int t)//对没有收到支援的国家以及其同洲的国家的恐慌值改变
{
    int j;
    int bel=country[t].belong;
    country[t].panic+=1;
    if(country[t].panic>5)
    return 0;
    for(j=0;j<vec[bel].size();j++)
    {
        int cur=vec[bel][j];
        country[cur].panic+=1;
        if(country[cur].panic>5)
        return 0;
    }
    return 1;
}
int dfs(int k)
{
    if(k==K)
    return K;
    int i;int ans=k;
    struct node temp[maxn];
    memcpy(temp,country,sizeof(country));
    for(i=0;i<3;i++)
    {
        int cur=attack[i][k];
        country[cur].panic-=2;
        if(country[cur].panic<1)
        country[cur].panic=1;
        int next_1=attack[(i+1)%3][k];//这一波攻击没受到支援的一个国家
        int next_2=attack[(i+2)%3][k];//这一波攻击没受到支援的另一个国家
        if((!change(next_1))||(!(change(next_2))))
        {
            memcpy(country,temp,sizeof(country));//回溯
            continue;
        }
        ans=max(ans,dfs(k+1));
        memcpy(country,temp,sizeof(country));//回溯
    }
    return ans;
}
int main()
{
    int T;
    int cas=1;
    scanf("%d",&T);
    while(T--)
    {
        int i;int temp;
        scanf("%d%d%d",&n,&m,&K);
        for(i=0;i<m;i++)
        vec[i].clear();
        for(i=0;i<n;i++)
        {
            scanf("%d",&temp);
            vec[temp].push_back(i);
            country[i].belong=temp;
        }
        for(i=0;i<n;i++)
        scanf("%d",&country[i].panic);
        for(i=0;i<K;i++)
        scanf("%d%d%d",&attack[0][i],&attack[1][i],&attack[2][i]);
        printf("Case #%d: ",cas++);
        printf("%d\n",dfs(0));
    }
    return 0;
}

你可能感兴趣的:(hdu 4563XCOM Enemy Unknown dfs)