上下对调只改层的先后,左右对调只改列的先后,两种按钮互不干扰。所以能变成目标,当且仅当存在层的排列 p 和列的排列 q,使得当前表里第 pi 层、第 qj 列的灯号,正好等于目标表第 i 层第 j 列。
任意一种排列都能只用相邻交换排出来。把某一层从原来的位置挪到目标位置,每跨过一层就要按一次上下对调;列也一样。因此一种排列的最少相邻交换次数,等于这个排列里的逆序对个数:前面的下标比后面的下标更大的那些对。层和列的按钮可以分开统计,总次数是两边逆序数之和。
这里不能改用轮换个数。例如三列从 1,2,3 倒成 3,2,1,逆序对有 3 对,最少也要按 3 次;若只看轮换,会少算。
h 和 w 都不超过 5,全部层排列和列排列最多 5!×5!=14400 种。逐个检查是否与目标逐格相同,在对得上的那些里取逆序和的最小值。灯号可以重复,所以可能有多种排列都对得上,必须留下次数更小的。一种都对不上就输出 −1。已经和目标相同的排列是恒等排列,逆序数为 0。
展厅里挂着一块高 h、宽 w 的灯板。每盏灯标着一个整数编号。眼下亮着的样子记成表 A,希望呈现的样子记成表 B。
控制盒只有两种按钮,每种都能连按任意多次:
请问最少按多少次按钮,才能让 A 与 B 逐格相同。若怎样按都做不到,输出 −1。
同一块灯板上的编号允许相同。能对上的按法若不止一种,答案取次数最少的那种。
第一行两个整数 h 与 w,依次是层数和列数,满足 2≤h≤5,2≤w≤5。
接下来 h 行,每行 w 个整数,是当前灯号表 A(1≤Ap,q≤109)。
再接下来 h 行,每行 w 个整数,是目标灯号表 B(1≤Bp,q≤109)。
若无法变成目标,输出 −1;否则输出最少按钮次数。
输入
2 2
5 6
7 8
7 8
5 6
输出
1
说明
把上下两层整层换一次,灯号就与目标逐格相同,所以答案是 1。只换左右列无法得到这个目标。
输入
2 3
8 1 4
9 2 6
1 4 8
2 6 9
输出
2
说明
两层的相对次序不用动。列要从 (8,1,4) 变成 (1,4,8),相当于原第 2 列、第 3 列、第 1 列依次排到从左到右的位置。这个列次序有 2 对逆序,相邻列交换 2 次就能完成。例如先交换第 1、2 列,再交换第 2、3 列。
输入
2 2
2 5
7 9
2 7
5 9
输出
-1
说明
四种行列重排的结果分别是
没有一种等于目标,因此输出 −1。
© CodeFun2000 · 使用条款
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册