题意:在一个n*m图中放1*2或者2*1的长方形,问是否存在唯一的方法填满图中的‘.’
因为如果存在唯一的方法填点的话肯定要先填只有一个相邻点的点
比如1*4的图
. . . .肯定先填最左边的或者最右边的,如果找不到这样的点说明不存在唯一解
如2*2的图
. .
. .
#include <bits/stdc++.h>
using namespace std;
#define MAX 2020
char s[2020][2020];
int n,m;
int d1[4]= {-1, 1, 0, 0};
int d2[4]={0, 0, -1, 1};
#define UP 0
#define DN 1
#define LF 2
#define RT 3
int vilne(int x,int y)
{
if(x>=0&&x<n&&y>=0&&y<m&&s[x][y]=='.')return 1;
return 0;
}
int candfs(int x,int y)
{
int cnt = 0, nx, ny, i;
if(!vilne(x,y)) return 0;
for(int i=0;i<4;i++)
{
nx=x+d1[i],ny=y+d2[i];
if(vilne(nx,ny))cnt++;
}
if(cnt==1)return 1;
return 0;
}
void dfs(int x,int y)
{
int nx,ny,i;
for(i=0;i<4;i++)
{
nx=x+d1[i],ny=y+d2[i];
if(vilne(nx,ny))break;
}
if (i == UP) s[x][y] = 'v', s[nx][ny] = '^';
if (i == DN) s[x][y] = '^', s[nx][ny] = 'v';
if (i == LF) s[x][y] = '>', s[nx][ny] = '<';
if (i == RT) s[x][y] = '<', s[nx][ny] = '>';
x=nx,y=ny;
for(int i=0;i<4;i++)
{
nx=x+d1[i];ny=y+d2[i];
if(candfs(nx,ny))dfs(nx,ny);
}
}
int main()
{
scanf("%d%d", &n,&m);
for(int i=0; i<n; i++)
scanf("%s",s[i]);
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(candfs(i,j)) dfs(i,j);
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(s[i][j]=='.')
{
puts("Not unique");return 0;
}
}
}
for (int i = 0; i < n; ++i) printf("%s\n", s[i]);
return 0;
}