Description
Input
Output
Sample Input
4 1 5 2 4 1 3 3 4 1 2 2 4 2 3 3 2 2 2 3 2 3 2 2 2
Sample Output
Case #1: NO Case #2: YES 4 3 4 2 1 2 4 3 4 Case #3: YES 1 2 3 2 3 1 Case #4: YES 1 2 2 3 3 1
这道题就是搜索,剪枝优化是如果当前未染色的点为x,(x+1)/2<max(col[i]),就可以return了。
1 #include <algorithm> 2 #include <iostream> 3 #include <cstring> 4 #include <cstdio> 5 using namespace std; 6 const int N=6; 7 int id[N][N],L[N*N],U[N*N],c[N*N]; 8 int T,cas,n,m,k,map[N*N],p[N*N]; 9 bool DFS(int x){ 10 if(x==n*m+1)return true; 11 for(int i=1;i<=k;i++) 12 if((n*m+2-x)/2<c[i])return false; 13 for(int i=1;i<=k;i++){ 14 if(c[i]==0)continue; 15 if(map[L[x]]!=i&&map[U[x]]!=i){ 16 c[i]-=1;map[x]=i; 17 if(DFS(x+1))return true; 18 c[i]+=1;map[x]=0; 19 } 20 } 21 return false; 22 } 23 int main(){ 24 scanf("%d",&T); 25 while(T--){int idx=0; 26 scanf("%d%d%d",&n,&m,&k); 27 for(int i=1;i<=k;i++) 28 scanf("%d",&c[i]); 29 for(int i=1;i<=n;i++) 30 for(int j=1;j<=m;j++) 31 id[i][j]=++idx; 32 for(int i=1;i<=n;i++) 33 for(int j=1;j<=m;j++){ 34 L[id[i][j]]=id[i][j-1]; 35 U[id[i][j]]=id[i-1][j]; 36 } 37 printf("Case #%d:\n",++cas); 38 if(DFS(1)){ 39 puts("YES"); 40 for(int i=1;i<=n;i++){ 41 for(int j=1;j<m;j++) 42 printf("%d ",map[(i-1)*m+j]); 43 printf("%d\n",map[i*m]); 44 } 45 } 46 else puts("NO"); 47 } 48 return 0; 49 }
搜索(剪枝优化):HDU 5113 Black And White
原文:http://www.cnblogs.com/TenderRun/p/5943375.html