#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;
}

本文解析了一道涉及深度优先搜索策略的模拟题,通过枚举每次被攻击国家及其恐慌值变化来求解最大回合数。代码实现了递归深搜算法,并通过状态变量控制搜索流程。
141

被折叠的 条评论
为什么被折叠?



