XCOM Enemy Unknown
DFS的过程中引用一个指针对数组的引用是很不靠谱的, 以后要引用, 尽量传一个值, 类似于用结构体, 封装一个数组。
http://acm.hdu.edu.cn/showproblem.php?pid=4536
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
const int MM = 22222; int N,M, Q; struct Info { int belong[22]; int val[22]; }p; vector<int>B[MM]; int ret,g; int a[5][MM]; Info t; void get_data() { int i,j,k; scanf("%d%d%d",&N,&M,&Q); for(i=0;i<MM;i++) B[i].clear(); for(i=0;i<N;i++) { scanf("%d",&p.belong[i]); B[p.belong[i]].push_back(i); } for(i=0;i<N;i++) scanf("%d",&p.val[i]); } void dfs(int h,Info tt,int sum) { int i,j,k,v; bool flag; if(sum>ret) ret=sum; if(h>=Q) return; for(i=0;i<3;i++) { t=tt; flag=false; t.val[a[i][h]]-=2; if(t.val[a[i][h]]<1) t.val[a[i][h]]=1; for(j=0;j<3;j++) { if(i==j) continue; t.val[a[j][h]]+=2; if(t.val[a[j][h]]>5) {flag=true;break;} for(k=0;k<B[t.belong[a[j][h]]].size();k++) { v=B[t.belong[a[j][h]]][k]; if(v==a[j][h]) continue; t.val[v]+=1; if(t.val[v]>5) {flag=true;break;} } if(flag) break; } if(!flag) dfs(h+1,t,sum+1); } } void solve() { int i,j,k; ret=0; for(i=0;i<Q;i++) { scanf("%d%d%d",&a[0][i],&a[1][i],&a[2][i]); } dfs(0,p,0); printf("Case #%d: %d\n",g++,ret); }