HDU - 5113 - Black And White(dfs)
2016-09-16 17:03
471 查看
Black And White
Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Others)Total Submission(s): 3031 Accepted Submission(s): 831
Special Judge
Problem 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 ci 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 ci (ci > 0), denoting the number of cells where the i-th color should be used.
It’s guaranteed that c1 + c2 + · · · + cK = 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:
YES
1 2 3
2 3 1
Case #4:
YES
1 2
2 3
3 1
题意:给一个N*M的格子,给出K种颜色以及每种颜色的数目,保证数目和相加 = N*M,求一种方案使得上下左右相邻的格子颜色都不相同。
思路:将颜色数目从大到小排序,记录每种颜色的id,找到一种解就返回。
wa了无数发,怀疑人生一中午,然后发现没有记录颜色id orzzzzzzz 简直.............
#include <stdio.h> #include <math.h> #include <string.h> #include <algorithm> #include <queue> #include <iostream> #include <assert.h> #define INF 0x3f3f3f3f using namespace std; typedef long long ll; #define PI acos(-1.0) const int M = 4e2 + 10; int n, m, k; int ans[8][8]; struct node { int id; int cnt; }color[30]; bool cmp(node a, node b) { return a.cnt < b.cnt; } bool dfs(int x, int y) { if (x == n + 1) return true; if (y == m + 1) return dfs(x + 1, 1); for (int i = k; i >= 1; i--) { if (!color[i].cnt) continue; if (ans[x-1][y] == color[i].id || ans[x][y-1] == color[i].id) continue; color[i].cnt--; ans[x][y] = color[i].id; if (dfs(x, y + 1)) return true; color[i].cnt++; } return false; } int main() { int T; cin >> T; for (int tt = 1; tt <= T; tt++) { memset(ans, 0, sizeof(ans)); memset(color, 0, sizeof(color)); scanf("%d%d%d", &n, &m, &k); for (int i = 1; i <= k; i++) { scanf("%d", &color[i].cnt); color[i].id = i; } sort(color + 1, color + 1 + k, cmp); printf("Case #%d:\n", tt); if(color[k].cnt > (n * m + 1) / 2){ printf("NO\n"); continue; } if (dfs(1, 1)) { printf("YES\n"); for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { if (j == m) printf("%d\n", ans[i][j]); else printf("%d ", ans[i][j]); } } } else printf("NO\n"); } return 0; }
相关文章推荐
- HDU 5113 Black And White(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搜索+剪枝)
- HDU 5113 Black And White (dfs神剪枝)
- hdu 5113 Black And White (dfs回溯+剪枝)
- 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 (搜索DFS)2014ICPC北京站现场赛
- HDU 5113 Black And White (dfs)
- HDU 5113 Black And White(DFS)
- hdu 5113 Black And White (dfs+强力剪枝)
- HDU 5113 Black And White(暴力dfs+减枝)
- Black And White HDU - 5113 (dfs+剪枝)
- 搜索(剪枝优化):HDU 5113 Black And White
- hdoj 5113 Black And White DFS+剪枝
- Hdu 5113 Black and White ---2014北京现场赛B题