题目链接:http://codeforces.com/problemset/problem/515/D
感觉是挺有意思的一道题目
题意:给你一个n*m的矩阵,要求你用1*2的方格把这个矩阵给填满,其中格子是"*"号的格子不能填,如果不存在填法或者存在多种填法就输出"Not unique"。如果存在就输出填满后的矩阵,填充的方式如sample所示
思路:对于相邻的两个"."进行连边,并对这些点标记度数。然后采用贪心的方法,将度数为1的点都放入队列,对每个这样的点采取贪心的放置方式(某个点如果度数为1的话,那么它的放置的方向一定是确定了的,所以可以贪心放置),放置了1*2的方格后对删掉连接这个格子的所有边,并将所有度数为1的点再次放入队列(有没有一种拓扑的感觉)。如果还有剩下的点没被方格覆盖,就说明他们的度数大于等于2,那么它们之间的放置方法一定不唯一,肯定输出"Not unique"。最后再扫描一下所有的方格,如果还有没有被覆盖的格子的话,也输出"Not unique"。
代码:
#include
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long ll;
#define pii pair
using namespace std;
const int maxn = 2003;
int dx[] = {0,1,0,-1};
int dy[] = {1,0,-1,0};
char haha[2][8] = {"<^>v",">v<^"};
char ma[maxn][maxn];
int n,m;
queue
que;
int deg[maxn][maxn];
int main()
{
scanf("%d%d",&n,&m);
int ii,jj;
for(int i = 1;i <= n;i++)
for(int j = 1;j <= m;j++)
scanf(" %c",&ma[i][j]);
for(int i = 1;i <= n;i++)
for(int j = 1;j <= m;j++)
{
for(int k = 0;k < 4;k++)
{
ii = i + dx[k];
jj = j + dy[k];
if(ma[ii][jj] == '.')
deg[i][j]++;
}
if(deg[i][j] == 1)
que.push(pii(i,j));
}
pii temp;
while(!que.empty())
{
temp = que.front();
que.pop();
int i = temp.first,j = temp.second;
if(ma[i][j] != '.')continue;
int mark = -1;
int find = 0;
for(int k = 0;k < 4;k++)
{
ii = i + dx[k];
jj = j + dy[k];
mark = k;
if(ma[ii][jj] == '.'){
find = 1;
break;
}
}
if(!find)
{
puts("Not unique\n");return 0;
}
ma[i][j] = haha[0][mark];
ma[ii][jj] = haha[1][mark];
deg[i][j] = 0;
deg[ii][jj] = 0;
for(int k = 0;k < 4;k++)
{
int iii = ii + dx[k];
int jjj = jj + dy[k];
deg[iii][jjj]--;
if(deg[iii][jjj] == 1)
que.push(pii(iii,jjj));
}
}
for(int i = 1;i <= n;i++)
for(int j = 1;j <= m;j++)
if(ma[i][j] == '.')
{
puts("Not unique");
return 0;
}
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= m;j++)
printf("%c",ma[i][j]);
printf("\n");
}
}