最少所需移动的格子数 求C++大神编程求解

ckgloria 2014-05-05 08:35:01
以下是4X5的单元格,每一格子所在位置用Xij表示,如图白色格子为X13(第一行第三列),黄色的格子可以移动到白色格子处(如图X12,X14,X23均有机会移动到X13),且每次只能移动一格。要求任意位置的黄色格子移动到第一行(可以是第一行的任意位置)其过程产生的移动总步数的最小值。

...全文
335 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ckgloria 2014-05-07
  • 打赏
  • 举报
回复

想推广到任意情况,即现在格子总数变成了nXm,黄白格子数任意(但满足第一行至少有一个白格子,白+黄=nXm),问第一次移动黄格子(可以是任意一个)所需的步数,再假设一旦移动到第一行后黄格子立即转变为白格子,那么从第二次开始到第n次,每次所需最少步数该如何求。
//---------------希望能给出代码-----------------
qq328348253 2014-05-06
  • 打赏
  • 举报
回复
可能我对于你说的第一行理解有所错误,但是道理仍然有用,就这样。
qq328348253 2014-05-06
  • 打赏
  • 举报
回复

请看图,以X25为例,想要X25移动到第一行,最好的路线应该是直上(其实不管任何一格,想要纵向移动,最好的路线都是直接纵向移动)。
那么,想要某一格‘A’达到纵向移动一格,只有一个办法(以纵向向上为例),就是把白色格子移动到‘A’的上面,此时‘A’就可纵向向上移动一格(看图)。从白色格子移动到‘A’的上面一共移动了4格(公式,A格的上方一格的坐标X35与白色格的坐标X13横向纵向距离之和,此处需要说明一下,因为目标是把格子移动到第一行,而白色格子在最下面一行,所以第一步肯定是把白色格移动到目标格子的上方)。此时‘A’向上移动一步到达X35,然后此时,白色格子在‘A’的下方,第二步就是再把白色格子移动到‘A’的上方(看图),因为是9宫格,从X25到X45需要绕过‘A’,则又移动了4格(此处不需要公式,如此移动是规定步骤规定步数了),然后‘A’向上移动一步到达第一行,目标达成。
首先,当目标格子在第一行时,无需移动,直接步数为0。
总结一下公式,首先目标格子到达第一行需要的纵向移动步数为:4 - 目标格子的首坐标(譬如例子X25,就是4-2固定步数)。
第二条公式:白色格子从X13开始移动,第一步是移动到目标格子上方,步数是目标格子坐标与白色格子坐标的两个坐标相减然后求和。例X25与X13,求的和为4。
第三条公式,如果第一次移动后目标格子还不在第一行,则此时相差多少行就加一次4,譬如X25移动到X35后,离第一行还差一行,则加4.
总结三条公式,可以求得移动所需最少步骤。
lm_whales 2014-05-06
  • 打赏
  • 举报
回复
这个方式似乎是固定的 如果本格在第一行,不用移动 如果不在把白格子移动到黄下面一行同一列 白黄交换,白格子和侧面一个格, 交换然后再次移动到黄格子新位置的下面一格子,如此反复即可 这个算法,不需要搜索,只需要简单的判断一下即可
mishisanyi 2014-05-06
  • 打赏
  • 举报
回复
这个思路其实很简单,楼主不是希望将源代码写出来给你吧
逸萌 2014-05-06
  • 打赏
  • 举报
回复
ckgloria 2014-05-06
  • 打赏
  • 举报
回复
引用 4 楼 qq328348253 的回复:
可能我对于你说的第一行理解有所错误,但是道理仍然有用,就这样。
//--------------------------------------------------------------------------------------------------------- 嗯,我的原意是将黄色的格子移动到目前白色格子所处的那一行(即我说的第一行)。但我还是有一些疑问 (1)你的计算方法是min=固定移动格子数+白色格子移动数,怎样验证目标黄格子移动到第一行同列就是它 的最小移动数,能否排除它移动到其他列的可能。 (2)还有假设各个黄格子是不同的(比如它有自己编号1,2,3...,初始情况正好与位置编号一致),每移动一次黄格子后,相对于前一步它的位子也发生了变化。再假设我现在要移动2个黄格子,分2次完成,第一次某位置黄格子移动到第一行后立即转变为白格子,到第二次移动时图中白格子数量变成了2,那么此刻黄格子再移动第一行最少移动步数又该如何计算。 (3)推广到任意情况,即现在格子总数变成了nXm,黄白格子数任意(但满足第一行至少有一个白格子,白+黄=nXm),问第一次移动黄格子(可以是任意一个)所需的步数,按照(2)的假设第二次...第n次所需步数 就是这样子,希望能给我一些思路!!
一起来玩玩呗 2014-05-05
  • 打赏
  • 举报
回复
递归回溯

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧