HDU4536 XCOM Enemy Unknown(dfs)

题目链接

分析:

用dfs枚举每一波攻击的三个国家。

很暴力,但没想到0ms。

 

#include <iostream>
#include <cstdio>
#include <vector>

using namespace std;

const int maxn = 20;

int p[maxn], nervous[maxn], n, m, k, max_cnt;
int att[110][3];

void dfs(int cn) {
    //界限
    if(max_cnt >= k) return ;
    if(cn >= k) {
        max_cnt = k; return ;
    }

    int a[3], bak[3];
    for(int v=0; v<3; v++) {    //枚举支援的国家
        /*
            * 被支援的国家为 att[cn][v]
            * 其他两个国家为 att[cn][(v+1)%3] 和 att[cn][(v+2)%3]
        */
        a[0] = att[cn][v];  //将国家序号存起来,方便调用
        a[1] = att[cn][(v+1)%3];
        a[2] = att[cn][(v+2)%3];

        bak[0] = nervous[a[0]];  //备份
        bak[1] = nervous[a[1]];
        bak[2] = nervous[a[2]];

        nervous[a[0]] -= 2;
        if(nervous[a[0]] < 1) nervous[a[0]] = 1;
        nervous[a[1]] += 2;
        nervous[a[2]] += 2;

        //数据已经保证受攻击的3个国家一定在不同的洲
        for(int i=0; i<n; i++) {
            if(p[i] == p[a[1]] && i != a[1]) nervous[i]++;
            if(p[i] == p[a[2]] && i != a[2]) nervous[i]++;
        }

        //价差是否都小于5
        int flag = true;
        for(int i=0; i<n; i++) {
            if(nervous[i] > 5) {
                max_cnt = max(max_cnt, cn);
                flag = false;
            }
        }

        if(flag) dfs(cn+1);

        //还原
        for(int i=0; i<n; i++) {
            if(p[i] == p[a[1]] && i != a[1]) nervous[i]--;
            if(p[i] == p[a[2]] && i != a[2]) nervous[i]--;
        }

        nervous[a[0]] = bak[0];
        nervous[a[1]] = bak[1];
        nervous[a[2]] = bak[2];
    }
}

int main(){
    int T;

    scanf("%d", &T);

    for(int kase=1; kase<=T; kase++) {
        scanf("%d%d%d", &n, &m, &k);

        for(int i=0; i<n; i++) {
            scanf("%d", &p[i]);
        }

        for(int i=0; i<n; i++) {
            scanf("%d", &nervous[i]);
        }

        for(int i=0; i<k; i++) {
            scanf("%d %d %d", &att[i][0], &att[i][1], &att[i][2]);
        }

        max_cnt = 0;
        printf("Case #%d: ", kase);

        //搜索
        dfs(0);

        printf("%d\n", max_cnt);
    }

    return 0;
}

 

posted on 2013-08-02 14:32  Still_Raining  阅读(342)  评论(0编辑  收藏  举报