hdu 4536 dfs

题意:XCOM-Enemy Unknown是一款很好玩很经典的策略游戏.
在游戏中,由于未知的敌人--外星人入侵,你团结了世界各大国家进行抵抗.随着游戏进展,会有很多的外星人进攻事件.每次进攻外星人会选择3个国家攻击,作为联盟的指挥者,你要安排有限的联盟军去支援其中一个国家,抵抗进攻这个国家的外星人.战斗胜利之后这个被支援的国家恐慌值就会-2点(恐慌值最少减为1),而其他两个未被支援的国家恐慌值就会+2点,同时和这两个国家在相同大洲的其他国家恐慌值也会+1点.当一个国家的恐慌值超过5点,这个国家就会对联盟失去信心从而退出联盟.现在给你外星人将会进攻的地点,问你最多能在不失去任何一个国家信任的情况下抵挡多少次外星人的进攻.

链接:点我

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<queue>
 7 #include<map>
 8 using namespace std;
 9 #define MOD 1000000007
10 const int INF=0x3f3f3f3f;
11 const double eps=1e-5;
12 #define cl(a) memset(a,0,sizeof(a))
13 #define ts printf("*****
");
14 const int MAXN=1005;
15 int n,m,tt,k;
16 int max_num;
17 int id[MAXN],a[MAXN][3],nev[MAXN];
18 void dfs(int num)
19 {
20     if(max_num>=k)   return;
21     if(num>=k)
22     {
23         max_num=k;
24         return;
25     }
26     for(int i=0;i<3;i++)    //枚举被支援的国家
27     {
28         int k1=nev[a[num][i]];
29         int k2=nev[a[num][(i+1)%3]];
30         int k3=nev[a[num][(i+2)%3]];    //备份三个被进攻国家的恐慌值
31         nev[a[num][i]]-=2;
32         if(nev[a[num][i]]<=0)  nev[a[num][i]]=1;
33         nev[a[num][(i+1)%3]]+=2;
34         nev[a[num][(i+2)%3]]+=2;
35         for(int j=0;j<n;j++)
36         {
37             if(id[j]==id[a[num][(i+1)%3]]&&j!=a[num][(i+1)%3])  nev[j]+=1;
38             if(id[j]==id[a[num][(i+2)%3]]&&j!=a[num][(i+2)%3])  nev[j]+=1;
39         }
40         bool flag=1;
41         for(int j=0;j<n;j++)
42         {
43             if(nev[j]>=6)
44             {
45                 max_num=max(max_num,num);
46                 flag=0;
47                 break;
48             }
49         }
50         if(flag)    dfs(num+1);
51 
52         for(int j=0;j<n;j++)
53         {
54             if(id[j]==id[a[num][(i+1)%3]]&&j!=a[num][(i+1)%3])  nev[j]-=1;
55             if(id[j]==id[a[num][(i+2)%3]]&&j!=a[num][(i+2)%3])  nev[j]-=1;
56         }
57         nev[a[num][i]]=k1;
58         nev[a[num][(i+1)%3]]=k2;
59         nev[a[num][(i+2)%3]]=k3;    //还原三个被进攻国家的恐慌值
60     }
61 }
62 int main()
63 {
64     int i,j;
65     #ifndef ONLINE_JUDGE
66     freopen("1.in","r",stdin);
67     #endif
68     scanf("%d",&tt);
69     int kase=0;
70     while(tt--)
71     {
72         kase++;
73         scanf("%d%d%d",&n,&m,&k);
74         for(i=0;i<n;i++)
75         {
76             scanf("%d",&id[i]);
77         }
78         for(i=0;i<n;i++)
79         {
80             scanf("%d",&nev[i]);
81         }
82         for(i=0;i<k;i++)
83             scanf("%d%d%d",&a[i][0],&a[i][1],&a[i][2]);
84         max_num=0;
85         printf("Case #%d: ",kase);
86         dfs(0);
87         printf("%d
", max_num);
88     }
89 }
原文地址:https://www.cnblogs.com/cnblogs321114287/p/4472189.html