本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
【ICPC】2022银川站 J. Let's Play Jigsaw Puzzles! | 模拟
vp 的时候没发现,写题解的时候每个题好像都有模拟标签(
题目链接
题目
题目大意
Bob 买了一个拼图。该拼图由 个矩形块组成,其中每个块包含一个用于识别的从 到 的唯一数字,以及四个表示相邻块的相关数字。
编号为 的块的四个相关数字为 、、 和 ,对应于四个相邻的块:
- 编号为 的块位于编号为 的块的北侧。
- 编号为 的块位于编号为 的块的南侧。
- 编号为 的块位于编号为 的块的西侧。
- 编号为 的块位于编号为 的块的东侧。
如果某个相关数字值为 −1,说明相应的一侧没有块。
将输入的 个块拼成一个 的大正方形,输入保证有解。
思路
我们定义一个二维数组表示整个 的大正方形地图,我们要为其中的每个位置找到合适的块。
首先找到 属性和 属性都为 -1 的块,它一定位于整个 的大正方形的左上角。由每个块都已经描述了与之相邻的块的信息,则我们可以遍历所有已经确定位置的块,将与之相邻的块也放进表示地图的二维数组中。
遍历结束后输出答案即可。
代码
#include <iostream>
#include <algorithm>
#include <math.h>
#include <stdio.h>
#include <map>
#include <vector>
#include <queue>
using namespace std;
const int N=1001;
int ans[N][N],m;
int w[N*N],s[N*N],a[N*N],d[N*N];
int main()
{
scanf("%d",&m);
int n=m*m;
for (int i=1;i<=n;++i)
{
scanf("%d%d%d%d",&w[i],&s[i],&a[i],&d[i]);
if (w[i]==-1&&a[i]==-1) ans[1][1]=i;
}
for (int i=2;i<=m;++i) ans[1][i]=d[ans[1][i-1]];
for (int i=2;i<=m;++i)
for (int j=1;j<=m;++j) ans[i][j]=s[ans[i-1][j]];
for (int i=1;i<=m;++i,printf("\n"))
{
printf("%d",ans[i][1]);
for (int j=2;j<=m;++j) printf(" %d",ans[i][j]);
}
return 0;
}