G - Black And White
=========================================================================================================================
数据范围很小,可以直接用DFS深搜出结果,,但如果不把数据 按升序排好序 就去进行深搜的话,会超时,优先让数量最多的放在前面
然后 如果有一个数字的数量 > (M×N+1)/2 则肯定 输出 NO;因为怎么也不可能不相邻;
设DFS(int y ,int x) 即对这个格子进行染色
=========================================================================================================================
代码:
1 #include <algorithm> 2 #include <cstdio> 3 using namespace std; 4 5 int Map[30][30]; 6 int n,m,k,cas=1; //行,列,数量,案例几 7 int flag = 0; //判定dfs return条件 8 9 struct Node{ 10 int num,s; //颜色编号,该颜色数量 11 }tail[40]; 12 bool cmp(Node a,Node b) { return a.s>b.s;} 13 14 void print() //输出函数 15 { 16 printf("Case #%d: YES ",cas++); 17 for(int i=1;i<=n;i++) 18 for(int j=1;j<=m;j++) 19 printf(j==m?"%d ":"%d ",Map[i][j]); 20 } 21 22 void dfs(int y,int x) 23 { 24 for(int i =1;i<=k;++i) 25 if(flag==1) return; 26 else if(tail[i].s) 27 { 28 if(Map[y-1][x]!=tail[i].num&&Map[y][x-1]!=tail[i].num) 29 { 30 --tail[i].s; //改颜色数量-1; 31 Map[y][x] = tail[i].num; 32 if(y==n&&x==m&&flag!=1) 33 {flag = 1;print();return;} //如果格子填充完了,则输出 34 else if(x==m) //如果这一行填充完了,跳转至下一行 35 dfs(y+1,1); 36 else //否则前往这一行的下一个格子 37 dfs(y,x+1); 38 ++tail[i].s; 39 } 40 } 41 } 42 int main() 43 { 44 int T; 45 scanf("%d",&T); 46 47 for(int num = 1;num<=T;++num) 48 { 49 scanf("%d %d %d",&n,&m,&k); 50 for(int i = 1;i<=k;++i) 51 { 52 scanf("%d",&tail[i].s); 53 tail[i].num = i; 54 } 55 sort(tail+1,tail+k+1,cmp); 56 if(tail[1].s>(n*m+1)/2) {printf("Case #%d: NO ",cas++); continue;} 57 flag = 0; 58 dfs(1,1); 59 } 60 return 0; 61 }