題目鏈接: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");
}
}