标签:
题目大意:给你一个n×m的矩阵,然后给你k种颜色,每种颜色有x种,所有的个数加起来恰好为n×m个。问你让你对这个矩阵进行染色问你,能不能把所有的小方格都染色,而且相邻两个颜色不同。
思路:一开始想的是构造,先按照个数进行排序,枚举每一个位置,贪心的策略先放多的,如果可以全部放下就输出YES,以及存贮的方案,否则输出NO,但是有bug,一直不对。。。
正解:dfs暴力枚举每一个点,裸的话需要25!,显然会超时,需要先排个序用构造的策略,让多的先放这样可以减枝。然后再dfs就可以了。
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 <algorithm> #include <iostream> #include <stdlib.h> #include <string.h> #include <iomanip> #include <stdio.h> #include <string> #include <queue> #include <cmath> #include <stack> #include <ctime> #include <map> #include <set> #define eps 1e-9 ///#define M 1000100 ///#define LL __int64 #define LL long long ///#define INF 0x7ffffff #define INF 0x3f3f3f3f #define PI 3.1415926535898 #define zero(x) ((fabs(x)<eps)?0:x) #define mod 1000000007 using namespace std; const int maxn = 55; int mp[10][10]; int n, m, k; struct node { int pos; int num; } f[maxn]; inline int read() { char ch; bool flag = false; int a = 0; while(!((((ch = getchar()) >= '0') && (ch <= '9')) || (ch == '-'))); if(ch != '-') { a *= 10; a += ch - '0'; } else { flag = true; } while(((ch = getchar()) >= '0') && (ch <= '9')) { a *= 10; a += ch - '0'; } if(flag) { a = -a; } return a; } void write(int a) { if(a < 0) { putchar('-'); a = -a; } if(a >= 10) { write(a / 10); } putchar(a % 10 + '0'); } bool dfs(int x, int y) { if(x == n) return true; if(y == m) return dfs(x+1, 0); for(int i = 0; i < k; i++) { if(!f[i].num) continue; if(x && mp[x-1][y] == i) continue; if(y && mp[x][y-1] == i) continue; mp[x][y] = i; f[i].num--; if(dfs(x, y+1)) return true; f[i].num++; } return false; } bool cmp(node a, node b) { return a.num > b.num; } int main() { int T; scanf("%d", &T); int Case = 1; while(T--) { n = read(); m = read(); k = read(); int flag = 0; int xp = (n*m+1)/2; for(int i = 0; i < k; i++) { f[i].num = read(); f[i].pos = i+1; if(f[i].num > xp) flag = 1; } printf("Case #%d:\n",Case++); sort(f, f+k, cmp); if(flag) { puts("NO"); continue; } dfs(0, 0); puts("YES"); for(int i = 0; i < n; i++) { for(int j = 0; j < m-1; j++) printf("%d ",f[mp[i][j]].pos); printf("%d\n",f[mp[i][m-1]].pos); } continue; } }
HDU 5113 Black And White(暴力dfs+减枝)
标签:
原文地址:http://blog.csdn.net/xu12110501127/article/details/42807345