百家号不支持代码格式,文章里的代码排版都是乱的。
如果需要拷贝代码,可以去同名的微信公众号。
Python列表常用来解决二维或多维问题,但对于初学者,从一维问题到二维问题,难度是质的变化,所以本篇用一个有趣的宫斗场景帮助初学者入门。
接上篇的题目,给定一些坐标点,判定它们是否在同一条直线上。
line = [ [168,2184],[19,247],[39,507],[63.3,822.9],[7.1,92.3],[9,117]]
需要用到下面3个基础的数学知识。
任取直线上2个点 (x1,y1) 和 (x2,y2)直线的斜率 k = (y2-y1) / (x2-x1)也即,同一直线上的任意2个点,斜率相同。
斜率相等的点未必都在同一条直线上。比如 (1,1), (2,2) 斜率 k = (2-1) / (2-1) = 1(1,2),(2,3) 斜率 k = (3-2) / (2-1) = 1但如下图,这4个点显然不在同一条直线上。
两点决定一条直线。但我们可以任选2个点,计算出斜率k。因为这2个点已经决定了一条直线。所以,其它点只要和这2个点中的任意一个计算出的斜率也是k,那么肯定也在这条直线上。 程序如下
line = [ [168,2184],[19,247],[39,507],[63.3,822.9],[7.1,92.3],[9,117]]
xm = line[0][0] - line[1][0]
ym = line[0][1] - line[1][1]
flag = True
for i in range(2,len(line)):
if (line[i][0] - line[0][0]) * ym == (line[i][1] - line[0][1]) * xm:
continue
else:
flag = False
break
print(flag)
二维问题
现实生活中,我们会碰到很多复杂的二维问题,甚至多维问题。
如迷宫问题
如各种棋类问题,包括课程最后会介绍的人机对战五子棋游戏。
如自动驾驶小车问题等等。
迷宫
国际象棋
自动驾驶小车
如何用Python来解决这些问题呢?
首先,需要将列表来保存二维平面的信息。
一般来说,我们有2种方式,需要根据题目的要求灵活使用。
比如说围棋的棋盘由19*19条线组成,一共有361个交叉点。
如何表示下图棋盘中的黑棋和白旗?
方式1:构造一个完整的二维列表,通过相应位置的元素记录信息。
go = [ [0] * 19 for i in range(19) ]
go[4][5] = 2
go[4][8] = 1
go[4][9] = 2
如上代码,变量go是一个19*19的列表。
假设我们用0表示没有棋子,1表示白棋,2表示黑棋。
go[4][5] 对应的是第5行,第6列,是黑棋。所以 go[4][5] = 2
go[4][8] 对应的是第5行,第9列,是白棋。所以 go[4][5] = 1
……
方式2:记录不同信息的元素坐标。
white = [[4,8],[5,7],[6,7] ]
black = [[4,5],[4,9],[5,8]]]
如上代码,white保存白棋的坐标。
black保存黑棋的坐标。
后宫争宠:如何巧遇皇帝
如何使用Python列表解决二维问题,是学好Python的必由之路。
不过对于初学者,难度是质的变化。
所以我们先来看一个有趣而又相对简单的二维问题。
曾经有那么几年,宫斗戏特别火。
皇帝后宫佳丽三千。
后妃们都想得到皇帝的宠爱,但争宠的前提自然是要能够见着皇帝。
所以在宫斗戏里,我们经常能看到“偶遇”皇帝的桥段。
《甄嬛传》里,甄嬛知道皇帝要经过倚梅园,所以才会在冰天雪地中,跪在梅花树下为皇帝祈福。
安陵容也是获悉了皇帝的游园路线,才会在湖边一展美妙的歌喉,引来皇帝的注意。
那么如何才能巧遇皇帝呢?
后妃争宠问题
如下图是一个很简陋的皇宫。只有 8*8 格。
某天,妃子们得知皇帝要出游。
如图,虽然皇帝可能走8个方向中的任意一个方向,不过一旦皇帝确定了方向,就只会笔直向前走。
于是妃子们赶紧“埋伏”起来,希望成为皇帝出游路上第一个碰到的人。
这里我们用方式2来保存上图二维平面上的信息。
皇帝的坐标是
emp = [3,4]
4个的妃子的坐标是
con = [[0,1],[0,7],[1,6],[5,5]]
当然,如果是给定了皇帝和妃子的位置,不需要用Python程序。
只需要看一眼就能知道,哪些妃子有可能“偶遇”皇帝。
如上图,很显然,只有[0,1]位置的安陵容,和[1,6]位置的皇后可能“偶遇”皇帝。
[0,7]位置的沈眉庄虽然也在皇帝的可能行进路线上,但是被皇后挡住了。
而[5,5]位置的甄嬛压根就不可能“偶遇”皇帝。
位置随机的皇帝和妃子
但如果皇帝的位置是随机的
emp = random.sample(range(0,7),2)
妃子们的位置是随机的.
con = [random.sample(range(0,7),2) for i in range(10)]
while emp in con :
con.remove(emp)
注:因为妃子们的位置是随机的,有可能坐标和皇帝的一样。所以通过while循环把这样的妃子删除掉。
如何判断哪些妃子可能“偶遇”皇帝?