100个python算法超详细讲解:黑白子交换
【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算法超详细讲解:黑白子交换相关推荐
- 100个python算法超详细讲解:搬山游戏
[100个python算法超详细讲解]@谷歌学术 1.问题描述 设有n座山,计算机与人作为比赛的双方,轮流搬山.规定每次搬 山数不能超过k座,谁搬最后一座谁输.游戏开始时,计算机请人输入 山的总数n和 ...
- 100个python算法超详细讲解:平分7筐鱼
[100个python算法超详细讲解]@谷哥技术 1.问题描述 2.乙.丙三位渔夫出海打鱼,他们随船带了21只箩筐.当晚返航时, 他们发现有7筐装满了鱼,还有7筐装了半筐鱼,另外7筐是空的,由于他们 ...
- 100个python算法超详细讲解:邮票组合
[100个python算法超详细讲解]@谷哥技术 1.问题描述 我们寄信都要贴邮票,在邮局有一些小面值的邮票,通过这些小 面值邮票中的一张或几张的组合,可以满足不同邮件的不同邮资.现 在,邮局有4种不 ...
- 100个python算法超详细讲解:递归解决年龄问题
[100个python算法超详细讲解]@谷哥技术 1.问题描述 有5个人坐在一起,问第5个人多少岁,他说比第4个人大2岁.问 第4个人多少岁,他说比第3个人大2岁.问第3人多少岁,他说比第2个 人大2 ...
- 100个python算法超详细讲解:谁是窃贼
[100个python算法超详细讲解]@谷哥技术 1.问题描述 警察审问4名窃贼嫌疑犯.现在已知,这4人当中仅有一名是窃 贼,还知道这4个人中的每个人要么是诚实的,要么总是说谎. 下面是这4个人给警察 ...
- 100个python算法超详细讲解:抢30游戏
[100个python算法超详细讲解]@谷歌学术 1.问题描述 由两个人玩"抢30"游戏,游戏规则是:第一个人先说"1"或"1,2",第 二 ...
- 100个python算法超详细讲解:卡布列克常数
[100个python算法超详细讲解]@谷哥技术 1.问题描述 对于任意一个4位数n,进行如下的运算: 1)将组成该4位数的4个数字由大到小排列,形成由这4个数字构 成的最大的4位数. 2)将组成该4 ...
- 100个python算法超详细讲解:孪生素数
[100个python算法超详细讲解@谷哥技术] 1.问题描述 本节要研究孪生素数的问题,先来看看什么是孪生素数. 所谓孪生素数指的是间隔为2的两个相邻素数,因为它们之间的距离已经 近得不能再近了,如 ...
- 100个python算法超详细讲解:狼追兔子
[100个python算法超详细讲解]@谷哥技术 1.问题描述 一只兔子躲进了10个环形分布的洞中的某一个.狼在第一个洞中 没有找到兔子,就隔一个洞,到第三个洞中去找:如果没有找到,就 隔两个洞,到第 ...
最新文章
- “领导跳槽想带我走,我要不要跟?”
- ML之NB:利用朴素贝叶斯NB算法(TfidfVectorizer+不去除停用词)对20类新闻文本数据集进行分类预测、评估
- 模拟窗口效果 Jquery
- 描述java源程序构成_Java第二章Java程序设计
- matlab全安装多大_不理会其他,我只中意T20天正V2.0软件,激活安装教程在这里...
- PAT乙类1005之继续(3n+1)猜想 (25 分)
- linux spi不使用框架,Linux spi驱动框架之执行流程
- inux下切换到root权限有以下几种方式
- 个人搭建网站主要流程以及六个基本步骤
- HBase 过滤器使用
- css 实现一个尖角_css3如何做尖角标签效果?
- 网络电视精灵 完整版
- 如何批量修改文件名?教你一招,轻松解决
- Topy Desk Privacy Policy
- python安装h5py
- 常用的博客社区(续)
- 2021 5G AIoT年度创新成果!发布!
- matlab 行列的扩展缩小操作
- 打印过的准考证电脑上有存档吗
- Git客户端如何连接远程仓库