【ICPC】2022银川站 J. Let's Play Jigsaw Puzzles! | 模拟

251 阅读2分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

【ICPC】2022银川站 J. Let's Play Jigsaw Puzzles! | 模拟

vp 的时候没发现,写题解的时候每个题好像都有模拟标签(

题目链接

Problem - J - Codeforces

题目

image.png

题目大意

Bob 买了一个拼图。该拼图由 m2m^2 个矩形块组成,其中每个块包含一个用于识别的从 11m2m^2 的唯一数字,以及四个表示相邻块的相关数字。

编号为 ii 的块的四个相关数字为 nin_isis_iwiw_ieie_i,对应于四个相邻的块:

  • 编号为 nin_i 的块位于编号为 ii 的块的北侧。
  • 编号为 sis_i 的块位于编号为 ii 的块的南侧。
  • 编号为 wiw_i 的块位于编号为 ii 的块的西侧。
  • 编号为 eie_i 的块位于编号为 ii 的块的东侧。

如果某个相关数字值为 −1,说明相应的一侧没有块。

将输入的 m2m^2 个块拼成一个 m×mm\times m 的大正方形,输入保证有解。

思路

我们定义一个二维数组表示整个 m×mm\times m 的大正方形地图,我们要为其中的每个位置找到合适的块。

首先找到 nn 属性和 ww 属性都为 -1 的块,它一定位于整个 m×mm\times m 的大正方形的左上角。由每个块都已经描述了与之相邻的块的信息,则我们可以遍历所有已经确定位置的块,将与之相邻的块也放进表示地图的二维数组中。

遍历结束后输出答案即可。

代码

#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;
}