【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;
}
因为如果存在唯一的方法填点的话肯定要先填只有一个相邻点的点
比如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;
}
相关文章推荐
- 【codeforces 516B】Drazil and Tiles
- Codeforces 515D - Drazil and Tiles (拓扑排序)
- Drazil and Tiles(CodeForces 515D)
- 【codeforces】515-D Drazil and Tiles
- 【codeforces 515D】Drazil and Tiles
- D. Drazil and Tiles (CF 515D bfs搜索)
- #292 (div.2) D.Drazil and Tiles (贪心+bfs)
- cf Round #292 (Div. 2)D. Drazil and Tiles 构造
- Codeforces-515C-Drazil and Factorial
- CodeForces 515C. Drazil and Factorial
- 【CodeForces 513C】Drazil and Factorial
- Codeforces Round #292 (Div. 2) D. Drazil and Tiles [拓扑排序 dfs]
- 【CodeForces】C. Drazil and Factorial
- codeforces 515C. Drazil and Factorial
- Codeforces Round #292 (Div. 1) B. Drazil and Tiles (类似拓扑)
- Codeforces Round #292 (Div. 2) -- D. Drazil and Tiles (拓扑排序)
- Codeforces Round #292 (Div. 1) B. Drazil and Tiles 拓扑排序
- codeforces 515B B. Drazil and His Happy Friends(模拟)
- [Codeforces515D]Drazil and Tiles(构造)
- [数论] Codeforces 819D R #421 D.Mister B and Astronomers & 516E R #292 E. Drazil and His Happy Friends