【100个python算法超详细讲解】@谷歌学术

1.问题描述
有3个白子和3个黑子如图7.1所示布置。

游戏的目的是用最少的步数将图7.1中白子和黑子的位置进行交
换,使得最终结果如图7.2所示。

游戏的规则如下:
1)一次只能移动一个棋子。
2)棋子可以向空格中移动,也可以跳过一个对方的棋子进入空
格。
3)白色棋子只能向右移动,黑色棋子只能向左移动,不能跳过两
个棋子。
请用计算机实现上述游戏。
2.问题分析
计算机解决这类问题的关键是要找出问题的规律,或者说是要制
定一套计算机行动的规则。分析本题,先用人来解决问题,可总结出
以下规则:
1)黑子向左跳过白子落入空格,转(5)。
2)白子向右跳过黑子落入空格,转(5)。
3)黑子向左移动一格落入空格(但不应产生棋子阻塞现象),转
(5)。
4)白子向右移动一格落入空格(但不应产生棋子阻塞现象),转
(5)。
5)判断游戏是否结束,若没有结束,则转(1)继续。
所谓“阻塞”现象指的是在移动棋子的过程中,两个尚未到位的同
色棋子连接在一起,使棋盘中的其他棋子无法继续移动。
例如,按下列方法移动棋子(“○”代表白子,“●”代表黑子,“△”代
表空格)。
0:○ ○ ○ △ ● ● ●
1:○ ○ △ ○ ● ● ●
2:○ ○ ● ○ △ ● ●
3:○ ○ ● △ ○ ● ●
4:两个●连在一起产生阻塞
○ ○ ● ● ○ △ ●
或两个○连在一起产生阻塞
○ △ ● ○ ○ ● ●
产生阻塞现象的原因是在第2步时棋子○不能向右移动,而只能将●
向左移动。
总结产生阻塞的原因是当棋盘出现“黑、白、空、黑”或“白、空、
黑、白”状态时,不能向左或向右移动中间的棋子,而只移动两边的棋
子。按照上述规则,可以保证在移动棋子的过程中不会出现棋子无法
移动的现象,并且可以用最少的步数完成白子和黑子的位置交换。
3.算法设计
可以有4种移动方式(“○”代表白子,“●”代表黑子,“△”代表空
格,“~”代表任意)。
·白棋跳过黑棋:~ ○ ● △ ~ ~ ~
·黑棋跳过白棋:~ ~ △ ○ ● ~ ~
·白棋移向空格:~ ~ ~ ○ △ ~ ~
·黑棋移向空格:~ ~ ~ △ ● ~ ~
(1)黑白棋要是能跳,则先跳
根据游戏规则,如果出现下列情况1,黑棋不能向右,此时只能白
棋跳过黑棋向右;同样,如果出现下列情况2,白棋不能向左,此时只
能黑棋跳过白棋向左。
情况1:~ ○ ● △ ○ ~ ~
情况2:~ ● △ ○ ● ~ ~
是否存在黑棋既能向左跳,白棋又可向右跳的可能性呢?即,情
况3或情况4同时存在的现象。
情况3:~ ○ ● △ ○ ● ~
情况4:○ ● △ ○ ● ~ ~
事实证明这两种情况是存在的。
(2)棋子只能移动时
1)若向右移动白子不会产生阻塞,则白子向右移动,分i=1和i>1
两种情况:
·i=1时,白棋只能向右移。
○ △ ~ ~ ~ ~ ~
·i>1时,i处的白棋只有在i-1和i+2位置上的棋子不同时才能向右移
动,即情况5或情况6。
情况5:~ ● ○ △ ○ ~ ~
情况6:~ ○ ○ △ ● ~ ~
分析:如果i-1和i+2位置上的棋子相同时,即情况7。
情况7:~ ~ ● ○ △ ● ~
如果将白子(“○”)向左移动到空格(“△”)处,会转变成情况8。
如果在情况7时,第二个任意子(“~”)位置是白子(“○”),白子跳过
黑子右移,会出现两个白子相连的情况,如情况9,将产生阻塞;或者
出现倒数第二个黑子跳过白子左移,出现两个黑子相连的情况,如情
况10,同样产生阻塞。
情况8:~ ~ ● △ ○ ● ~
情况9:~ △ ● ○ ○ ● ~
情况10:~ ~ ● ●

i = 0
while flag and i < 5: # 若白子可以向右跳过黑子,则白子向右跳
if t[i] == 1 and t[i + 1] == 2 and t[i + 2] == 0:

2)若向左移动黑子不会产生阻塞,则黑子向左移动,分i=5和i>1
两种情况:
·i=5时,黑棋只能向左移。
~ ~ ~ ~ ~ △ ●
·i>1时,i+1处的黑棋只有在i-1和i+2位置上的棋子不同时才能向左
移动,即,情况11或情况12。
情况11:~ ○ △ ● ● ~ ~
情况12:~ ● △ ● ○

i = 0
while flag and i < 5: # 若黑子可以向左跳过白子,则黑子向左跳
if t[i] == 0 and t[i + 1] == 1 and t[i + 2] == 2:

4.完整的程序
根据上面的分析,编写程序如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @author : liuhefei
# @Time : 2019/7/13 10:07
# @desc: 黑白子交换
# 打印输出结果
def printLine(a):
global number
print("No. %2d:…………………………" % number)
number += 1
print(" ", end='')
for i in range(7):
if a[i] == 1:
print('| * ', end='')
else:
if a[i] == 2:
print('| @ ', end='')
else:
print('| ', end='')
print(" |\n …………………………\n")
# 交换
def change(t, i, j):
term = t[i]
t[i] = t[j]
t[j] = term
return t
if __name__ == '__main__':
t = [1, 1, 1, 0, 2, 2, 2] # 初始化数组:1代表白子,2代表黑子,0代表空格
number = 0
printLine(t)
# 若还没有完成棋子的交换则继续进行循环
判断游戏是否结束
# 判断游戏是否结束
while t[0] + t[1] + t[2] != 6 or t[4] + t[5] + t[6] != 3:
# flag为棋子移动一步的标记,flag=True表示尚未移动棋子,flag=False表示已
经移动棋子
flag = True
i = 0
while flag and i < 5: # 若白子可以向右跳过黑子,则白子向右跳
if t[i] == 1 and t[i + 1] == 2 and t[i + 2] == 0:
t = change(t, i, i + 2) # 调用交换
printLine(t)
flag = False
i += 1
i = 0
while flag and i < 5: # 若黑子可以向左跳过白子,则黑子向左跳
if t[i] == 0 and t[i + 1] == 1 and t[i + 2] == 2:
t = change(t, i, i + 2)
printLine(t)
flag = False
i += 1
i = 0
while flag and i < 6: # 若向右移动白子不会产生阻塞,则白子向右移动
f = True
if i < 5:
f = t[i - 1] != t[i + 2]
if t[i] == 1 and t[i + 1] == 0 and (i == 0 or f):
t = change(t, i, i + 1)
printLine(t)
flag = False
i += 1
i = 0
while flag and i < 6: # 若向左移动黑子不会产生阻塞,则黑子向左移动
f = True
if i < 5:
f = t[i - 1] != t[i + 2]
if t[i] == 0 and t[i + 1] == 2 and (i == 5 or f):
t = change(t, i, i + 1)
printLine(t)
flag = False
i += 1

5.运行结果
在PyCharm下运行程序,结果如图7.3所示。

100个python算法超详细讲解:黑白子交换相关推荐

  1. 100个python算法超详细讲解:搬山游戏

    [100个python算法超详细讲解]@谷歌学术 1.问题描述 设有n座山,计算机与人作为比赛的双方,轮流搬山.规定每次搬 山数不能超过k座,谁搬最后一座谁输.游戏开始时,计算机请人输入 山的总数n和 ...

  2. 100个python算法超详细讲解:平分7筐鱼

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 2.乙.丙三位渔夫出海打鱼,他们随船带了21只箩筐.当晚返航时, 他们发现有7筐装满了鱼,还有7筐装了半筐鱼,另外7筐是空的,由于他们 ...

  3. 100个python算法超详细讲解:邮票组合

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 我们寄信都要贴邮票,在邮局有一些小面值的邮票,通过这些小 面值邮票中的一张或几张的组合,可以满足不同邮件的不同邮资.现 在,邮局有4种不 ...

  4. 100个python算法超详细讲解:递归解决年龄问题

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 有5个人坐在一起,问第5个人多少岁,他说比第4个人大2岁.问 第4个人多少岁,他说比第3个人大2岁.问第3人多少岁,他说比第2个 人大2 ...

  5. 100个python算法超详细讲解:谁是窃贼

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 警察审问4名窃贼嫌疑犯.现在已知,这4人当中仅有一名是窃 贼,还知道这4个人中的每个人要么是诚实的,要么总是说谎. 下面是这4个人给警察 ...

  6. 100个python算法超详细讲解:抢30游戏

    [100个python算法超详细讲解]@谷歌学术 1.问题描述 由两个人玩"抢30"游戏,游戏规则是:第一个人先说"1"或"1,2",第 二 ...

  7. 100个python算法超详细讲解:卡布列克常数

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 对于任意一个4位数n,进行如下的运算: 1)将组成该4位数的4个数字由大到小排列,形成由这4个数字构 成的最大的4位数. 2)将组成该4 ...

  8. 100个python算法超详细讲解:孪生素数

    [100个python算法超详细讲解@谷哥技术] 1.问题描述 本节要研究孪生素数的问题,先来看看什么是孪生素数. 所谓孪生素数指的是间隔为2的两个相邻素数,因为它们之间的距离已经 近得不能再近了,如 ...

  9. 100个python算法超详细讲解:狼追兔子

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 一只兔子躲进了10个环形分布的洞中的某一个.狼在第一个洞中 没有找到兔子,就隔一个洞,到第三个洞中去找:如果没有找到,就 隔两个洞,到第 ...

最新文章

  1. “领导跳槽想带我走,我要不要跟?”
  2. ML之NB:利用朴素贝叶斯NB算法(TfidfVectorizer+不去除停用词)对20类新闻文本数据集进行分类预测、评估
  3. 模拟窗口效果 Jquery
  4. 描述java源程序构成_Java第二章Java程序设计
  5. matlab全安装多大_不理会其他,我只中意T20天正V2.0软件,激活安装教程在这里...
  6. PAT乙类1005之继续(3n+1)猜想 (25 分)
  7. linux spi不使用框架,Linux spi驱动框架之执行流程
  8. inux下切换到root权限有以下几种方式
  9. 个人搭建网站主要流程以及六个基本步骤
  10. HBase 过滤器使用
  11. css 实现一个尖角_css3如何做尖角标签效果?
  12. 网络电视精灵 完整版
  13. 如何批量修改文件名?教你一招,轻松解决
  14. Topy Desk Privacy Policy
  15. python安装h5py
  16. 常用的博客社区(续)
  17. 2021 5G AIoT年度创新成果!发布!
  18. matlab 行列的扩展缩小操作
  19. 打印过的准考证电脑上有存档吗
  20. Git客户端如何连接远程仓库

热门文章

  1. Win10自带的重装系统方法(云重装)
  2. 发送原生ajax请求的步骤
  3. 中国胶原蛋白多肽市场前景动态分析及投资方向建议报告2022-2028年
  4. Java程序员惯性思维的一个错误
  5. pc服务器品牌入围项目招标公告,服务器招标公告
  6. hyit 第二届ctf校赛wp
  7. 计算机u盘病毒清除方式,如何操作才能将U盘中的病毒彻底?两种方法即可清除...
  8. 国开计算机专业英语,国开电大计算机专业英语阅读(河北)形考一
  9. SM5203高输入18V耐压单节锂电池线性充电芯片
  10. Hue 集成 Yarn