HDU 4536 状态搜索
来源:互联网 发布:大数据应用案例考试 编辑:程序博客网 时间:2024/05/22 08:28
/* 状态搜索,BFS。。 */#include<iostream>#include<cstdio>#include<algorithm>#include<string>#include<queue>#define manx 18using namespace std;struct node{ ///// 记录某状态 int mp[8][manx]; //// 大州 int temp;}ant[2]; int a[manx],b[manx],pos[manx],ans,sum;int n,m,k;queue<node>que;void judge(node te,int a,int b,int c){////帮助 a 元素 int h1=pos[a]; int h2=pos[b]; int h3=pos[c]; te.mp[h1][a]-=2; if(te.mp[h1][a]<1) te.mp[h1][a]=1; te.mp[h2][b]+=2; if(te.mp[h2][b]>5) return ; te.mp[h3][c]+=2; if(te.mp[h3][c]>5) return ; for(int i=0;i<n;i++){ if(te.mp[h2][i] && i!=b){ te.mp[h2][i]+=1; if(te.mp[h2][i]>5) return ; } if(te.mp[h3][i] && i!=c){ te.mp[h3][i]+=1; if(te.mp[h3][i]>5) return ; } } te.temp++; que.push(te); return ;}void fan(){ int z[4]; for(int i=0;i<3;i++) scanf("%d",&z[i]); while(!que.empty()){ node te=que.front(); if(sum<te.temp) { sum=te.temp; break; } /////这里有猫腻额 que.pop(); node p=te; judge(p,z[0],z[1],z[2]);///z[0]要帮助的 judge(p,z[1],z[0],z[2]);///z[1] judge(p,z[2],z[0],z[1]);///z[2] } }int main(){ int t; scanf("%d",&t); for(int ca=1;ca<=t;ca++){ ans=0; sum=0; scanf("%d%d%d",&n,&m,&k); for(int i=0;i<n;i++){ scanf("%d",&a[i]); } for(int i=0;i<n;i++){ scanf("%d",&b[i]); } while(!que.empty()) que.pop(); memset(ant,0,sizeof(ant)); for(int i=0;i<n;i++){ ant[ans].mp[a[i]][i]=b[i]; ///第a[i]个大洲 第 i 个位置 pos[i]=a[i]; } que.push(ant[ans]); for(int i=0;i<k;i++) fan(); printf("Case #%d: %d\n",ca,sum); }}/*69 3 20 0 0 1 1 1 2 2 25 3 3 3 3 3 3 3 30 3 60 3 6*/