其他分享
首页 > 其他分享> > 变色龙

变色龙

作者:互联网

题目背景
在一个 N×M 的,每个格子都有一种给定颜色的方格矩阵上,有一只变色龙在第 X 行第 Y 列处,他会在这个方格矩阵上移动。

移动规则如下:

变色龙只能朝相邻于当前方格的一个方格(上下左右)上移动一格,且不能移出边界。

众所周知,变色龙特异的身体会使自己的身体颜色随着环境颜色的变化而变化。所以如果移动到的方格和当前方格的颜色不同,变色龙颜色变化次数会+1,否则颜色变化次数不变。

然而变色龙并不希望能移动的步数最小,它希望颜色的变化次数最小。

它告诉你每个格子的颜色,以及它当前所在的格子,它希望你告诉它从当前格子分别到每个格子的最小颜色变化次数是多少。

输入格式
第一行包括四个正整数N,M,X,Y,描述矩阵大小以及变色龙起点的坐标。

输出格式
N 行每行 M 个非负整数,描述从起点开始出发到每个点的最少颜色变化次数。

样例
input

5 5 3 3
1 1 3 1 1
1 3 3 3 1
3 2 2 2 3
1 4 4 4 6
1 1 1 5 1

output

2 2 1 2 2
2 1 1 1 2
1 0 0 0 1
2 1 1 1 2
2 2 2 2 3

数据范围
时间限制:1s

空间限制:256M

颜色大小在[1,100]中,

测试点编号 N,M范围
1-3 \(1\le N,M\le5\)
4-5 \(1\le N,M\le100\)
6-7 \(1\le N,M\le500\)
8-10 \(1\le N\times M\le 1000000,1\le N,M\le2000\)

直接BFS肯定会超时的,所以我们考虑怎么优化。
一个数由一个点走向另一个点,答案要不会加一,要不不变。我们可以使用01BFS,改用双端队列,如果不变就从前端插入,否则就从后端插入,这样子可以让序列中的数尽量递增,可以达到\(O(n\times m)\)的复杂度。
当然,我们也可以使用最短路的dijkstra算法,改用优先队列,复杂度\(O(n\times mlogn)\)

标签:le,颜色,格子,次数,变色龙,方格
来源: https://www.cnblogs.com/mekoszc/p/16102635.html