标签:
题目大意:给你一个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