c++提问解除密码锁

解除密码锁
题目描述
假设你有一个 N 位数的滚轮式密码锁,密码锁的每一个滚轮都有 D 面,分别刻着 0∼D−1 的数字,并且可以向上或向下循环滚动。这个密码锁的滚轮一开始是随机的。

将滚轮从左到右编号,最左侧是滚轮 1,最右侧是滚轮 N。当所有滚轮滚到数字 0 的位置时,才能解锁这个密码锁。

每次操作均按如下操作方式:

确定一个区间 [l,r] (1≤l≤r≤N) ,旋转该区间内的所有滚轮,使这些滚轮一起向下或向上滚动一格。向上滚动会将滚轮数字 +1,向下滚动则是 −1。并且滚轮处于 D−1 数字时,向上滚动会回归数字 0 的位置;处于 0 数字时,向下滚动会回到数字 D−1 的位置。

除此之外,进行以上操作时,需满足以下条件:

第一次选择区间时允许任意选定区间
接下来每次选择的区间,必须包含上一次选择的区间
例如对于一个初始状态为 [1,1,2,2,3,3] 的密码锁,可以通过以下步骤完成解锁:

① 选取 [5,6] 区间的滚轮,向下滚动。

② 选取 [3,6] 区间的滚轮,向下滚动。

③ 选取 [1,6] 区间的滚轮,向下滚动。

以下则是一些不符合规则的操作示例:

① 先选取 [5,7] 再选取 [1,4] 是不符合规则的,因为 [5,7] 区间不被 [1,4] 所包含。

② 先选取 [2,7] 再选取 [3,6] 是不符合规则的,原因同上。

你的目标是使用最少的操作次数,解锁给定的密码锁。

输入格式
第一行一个整数 T,表示共有 T 组数据,每组数据格式如下:

第一行两个整数 N,D 分别表示密码锁位数和每个滚轮的面数;

第二行 N 个整数,对应从左到右每一位滚轮上的数字 Vi。

输出格式
共 N 行,对于每组数据,输出最少需要几次操作才能解锁。

测试样例
输入样例 #1
4
6 2
1 1 0 1 0 1
6 2
0 1 0 0 1 1
6 10
1 1 2 2 3 3
6 10
1 1 9 9 1 1
输出样例 #1
3
2
3
3

没悬赏

直接比较相邻的数就可以了吧?只需要通过条件判断向上还是向下调整为最少操作数就行了