您的位置:首页 > 其它

【codeforces 516B】Drazil and Tiles

2017-11-27 15:44 543 查看
题意:在一个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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: