HDUoj 5113 Black And White (dfs&剪枝
2017-08-01 16:40
381 查看
Black And White
Description
In mathematics, the four color theorem, or the four color map theorem, states that, given any separation of a plane into contiguous regions, producing a figure called a map, no more than four colors are required to color the regions of the map so that no two adjacent regions have the same color.— Wikipedia, the free encyclopedia
In this problem, you have to solve the 4-color problem. Hey, I’m just joking.
You are asked to solve a similar problem:
Color an N × M chessboard with K colors numbered from 1 to K such that no two adjacent cells have the same color (two cells are adjacent if they share an edge). The i-th color should be used in exactly c i cells.
Matt hopes you can tell him a possible coloring.
Input
The first line contains only one integer T (1 ≤ T ≤ 5000), which indicates the number of test cases.For each test case, the first line contains three integers: N, M, K (0 < N, M ≤ 5, 0 < K ≤ N × M ).
The second line contains K integers c i (c i > 0), denoting the number of cells where the i-th color should be used.
It’s guaranteed that c 1 + c 2 + · · · + c K = N × M .
Output
For each test case, the first line contains “Case #x:”, where x is the case number (starting from 1).In the second line, output “NO” if there is no coloring satisfying the requirements. Otherwise, output “YES” in one line. Each of the following N lines contains M numbers seperated by single whitespace, denoting the color of the cells.
If there are multiple solutions, output any of them.
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: 4000 YES 1 2 3 2 3 1 Case #4: YES 1 2 2 3 3 1
题意
给一个格子和几种颜色与数量 要求相邻点颜色不能相同题解:
剪枝方法 就是剩余格子数/2必定大于max(c[i])AC代码
#include <bits/stdc++.h> using namespace std; #define LL long long #define CLR(a,b) memset(a,(b),sizeof(a)) int mps[10][10]; int c[100]; bool flag; int n, m, k; void dfs(int x,int y,int color) { int res = (n-x)*m+m-y+1; for(int i = 1; i <= k; i++) if(c[i] > res/2) return; //剪枝 mps[x][y] = color; if(x==n && y==m) { flag = true; return; } if(y+1 <= m) { int dx =x; int dy = y+1; for(int i = 1; i<= k; i++) { if(c[i] && i!=mps[dx][dy-1] && i!=mps[dx-1][dy]) { c[i]--; dfs(dx,dy,i); if(flag) return; c[i]++; } } } else if(x+1 <= n) { int dx = x+1; int dy = 1; for(int i = 1; i <= k; i++) { if(c[i] && i!=mps[dx-1][dy]) { c[i]--; dfs(dx,dy,i); if(flag) return; c[i]++; } } } } int main() { int zz = 0; int T; scanf("%d",&T); while(T--) { scanf("%d%d%d",&n,&m,&k); for(int i = 1; i <= k; i++) { scanf("%d",&c[i]); } flag = false; CLR(mps,0); for(int i = 1; i <= k; i++) { c[i]--; dfs(1,1,i); if(flag) break; c[i]++; } if(flag) { printf("Case #%d:\nYES\n", ++zz); for(int i = 1; i<= n; i++) { for(int j = 1; j <= m; j++) { if(j == m) printf("%d\n",mps[i][j]); else printf("%d ",mps[i][j]); } } } else { printf("Case #%d:\nNO\n", ++zz); } } return 0; }
相关文章推荐
- hdoj 5113 Black And White(dfs, 剪枝)
- Black And White HDU - 5113 (dfs+剪枝)
- HDU 5113 Black And White (dfs神剪枝)
- 文章标题 HDU 5113 : Black And White (dfs+剪枝)
- hdu 5113: Black And White(dfs+强剪枝)
- HDU 5113 Black And White (dfs、剪枝)
- HDOJ5113 Black And White【dfs+剪枝】
- hdu 5113 Black And White (dfs回溯+剪枝)
- hdoj 5113 Black And White DFS+剪枝
- hdu5113 Black And White--DFS & 剪枝
- hdu 5113 Black And White (dfs+强力剪枝)
- HDU - 5113 Black And White 搜索+剪枝 ( 2014ACM/ICPC亚洲区北京站-重现赛(感谢北师和上交))
- Black And White (dfs + 剪枝)
- HDU 5113 Black And White(DFS)
- 搜索(剪枝优化):HDU 5113 Black And White
- HDU 5113 Black And White (dfs)
- HDU - 5113 - Black And White(dfs)
- HDU 5113 Black And White(暴力dfs+减枝)
- hdu 5113 Black And White(暴力+剪枝)
- HDU 5113 Black And White (搜索DFS)2014ICPC北京站现场赛