其实这道题并不是很难,但是确实不太好想啊。。。
题目大意:
跳跳棋是在一条数轴上进行的。棋子只能摆在整点上。每个点不能摆超过一个棋子。
我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置。我们要通过最少的跳动把他们的位置移动成x,y,z。(棋子是没有区别的)
跳动的规则很简单,任意选一颗棋子,对一颗中轴棋子跳动。跳动后两颗棋子距离不变。一次只允许跳过1颗棋子。
写一个程序,首先判断是否可以完成任务。如果可以,输出最少需要的跳动次数。
我们仔细的剖析一下题意:
我们从题目中可知,一共只有三种移动方式:
1.中间的棋子往左跳
2.中间的棋子往右跳
3.两边离中间近的棋子往中间跳(因为如果是远的棋子的话就会跳过两个了。。。)
那么我们知道,如果不断进行第三步操作,最后一定会得到中间棋子到两边距离相等的情况,那么如果两种摆放方式经过这种迭代后,到中间距离相等,那么就代表他们是可以互相转换的,反之则不能。
那么我们就可以判断是否可以完成任务了,而且我们知道棋子看的是相对位置,那么a b c,将a跳到bc中间就等于a,b同时向右移ab的差值,但是我们发现每一次减速度太慢,所以我们大可以将每一次移动差值步改为移动另一个差值%这个差值步,想一想正确性?
那么,我们怎么计算需要多少步呢?由于我们知道每一次都有三种选择,那么如果我们从距离相等的情况开始拓展,那么就会有两种选择。也就是这些状态构成了一颗二叉树。
那么我们所求的答案就是树上两点间距离啦!
原文地址:https://www.cnblogs.com/yufenglin/p/10624938.html
时间: 2024-10-14 02:11:48