Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 133 Accepted Submission(s): 34
直接搜索的。
用二进制进行压缩,3为二进制表示一个。用long long
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <map> #include <string> #include <set> #include <queue> #include <math.h> using namespace std; int a[20]; int b[20]; int x[100],y[100],z[100]; int ans; int n,m,k; long long change1(int t[]) { long long temp=0; for(int i=0;i<n;i++) { temp<<=3; temp|=t[i]; } return temp; } void change2(int t[],long long p) { for(int i=n-1;i>=0;i--) { t[i]=p&7; p>>=3; } } void dfs(long long state,int t) { ans=max(ans,t); if(t>=k)return; long long temp; bool flag; change2(a,state); a[x[t]]-=2; if(a[x[t]]<1)a[x[t]]=1; a[y[t]]+=1; a[z[t]]+=1; for(int i=0;i<n;i++) if(i!=x[t] && (b[y[t]]==b[i]||b[z[t]]==b[i])) a[i]++; flag=true; for(int i=0;i<n;i++) if(a[i]>5) { flag=false; break; } if(flag) { long long temp=change1(a); dfs(temp,t+1); } change2(a,state); a[y[t]]-=2; if(a[y[t]]<1)a[y[t]]=1; a[x[t]]+=1; a[z[t]]+=1; for(int i=0;i<n;i++) if(i!=y[t] && (b[x[t]]==b[i]||b[z[t]]==b[i])) a[i]++; flag=true; for(int i=0;i<n;i++) if(a[i]>5) { flag=false; break; } if(flag) { long long temp=change1(a); dfs(temp,t+1); } change2(a,state); a[z[t]]-=2; if(a[z[t]]<1)a[z[t]]=1; a[y[t]]+=1; a[x[t]]+=1; for(int i=0;i<n;i++) if(i!=z[t] && (b[y[t]]==b[i]||b[x[t]]==b[i])) a[i]++; flag=true; for(int i=0;i<n;i++) if(a[i]>5) { flag=false; break; } if(flag) { long long temp=change1(a); dfs(temp,t+1); } } int main() { int T; scanf("%d",&T); int iCase=0; while(T--) { iCase++; scanf("%d%d%d",&n,&m,&k); for(int i=0;i<n;i++) scanf("%d",&b[i]); for(int i=0;i<n;i++) scanf("%d",&a[i]); for(int i=0;i<k;i++) scanf("%d%d%d",&x[i],&y[i],&z[i]); ans=0; long long tmp=change1(a); dfs(tmp,0); printf("Case #%d: %d\n",iCase,ans); } return 0; }