题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5113
题面:
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
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
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <cmath> #include <cstdlib> #include <set> #include <algorithm> #include <string> #include <iomanip> #define LL long long using namespace std; int map [7][7],color[30]; int n,m,t,k,sz,amount,tmp; bool flag=false; void init() { for(int i=0;i<7;i++) map[0][i]=-1; for(int j=1;j<7;j++) map[j][0]=-1; } void dfs(int x,int y,int typ,int lef) { tmp=(lef+1)/2; for(int i=1;i<=k;i++) { if(color[i]>tmp) return; } if(flag)return; if(color[typ]==0)return; if(map[x-1][y]!=typ&&map[x][y-1]!=typ) { map[x][y]=typ; color[typ]--; if(x==n&&y==m) { flag=true; return; } else if(y==m) { tmp=0; for(int i=1;i<=k;i++) { if(color[i])tmp++; } if(tmp==1) { if(m!=1) { color[typ]++; return; } } for(int i=1;i<=k;i++) { if(color[i]) dfs(x+1,1,i,lef-1); } } else { for(int i=1;i<=k;i++) { if(color[i]) { dfs(x,y+1,i,lef-1); } } } color[typ]++; } return; } int main() { init(); scanf("%d",&t); for(int i=1;i<=t;i++) { set <int> cnt; printf("Case #%d:\n",i); scanf("%d%d%d",&n,&m,&k); amount=(n*m+1)/2; flag=true; if(k==1) { if(n*m!=1) flag=false; } for(int j=1;j<=k;j++) { scanf("%d",&color[j]); if(color[j]>amount) flag=false; } if(flag) { flag=false; for(int j=1;j<=k;j++) { sz=cnt.size(); if(color[j]) { cnt.insert(color[j]); if(cnt.size()>sz) dfs(1,1,j,n*m); } } } if(flag) { printf("YES\n"); for(int j=1;j<=n;j++) { printf("%d",map[j][1]); for(int k=2;k<=m;k++) printf(" %d",map[j][k]); printf("\n"); } } else { printf("NO\n"); } } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
HDU 5113 Black And White(DFS+剪枝)
原文地址:http://blog.csdn.net/david_jett/article/details/46916423