计算游戏棋盘中间四个方格的平方数的算法?
我正在用Python 3.3创建一个控制台版本的黑白棋(也叫反转棋)。现在我在制作棋盘,用户需要输入一个在4到16之间的偶数行数和偶数列数。请问我该如何写一个函数或者算法,来确定用户定义的棋盘中间的四个格子,以便放置最初的四个棋子呢?谢谢!
1 个回答
0
假设行数和列数分别是 rows
和 cols
的值,那么我们要用的行号是 rows/2-1
和 rows/2
。比如说,如果 rows==12
,那么这两个值就是5和6。同样,列号也是 cols/2-1
和 cols/2
。
需要注意的是,如果把棋盘看作一个线性数组,并且每一行的单元格是相邻存储的,你可以用 lr =(rows+1)*cols//2
来表示中心单元格,并初始化单元格 'lr'、lr-1
、lr-cols
和 lr-cols-1
作为中心单元格。这和上面的公式是等价的。举个例子:
for rows in (4,6,8):
for cols in (4,6,8):
lr = (rows+1)*cols//2
r = rows//2
c = cols//2
print rows, cols, ':\t', r,c, '\t', lr-cols-1, '\t', lr-cols, '\t', lr-1, '\t', lr, '\t', r*cols+c
会产生
4 4 : 2 2 5 6 9 10 10
4 6 : 2 3 8 9 14 15 15
4 8 : 2 4 11 12 19 20 20
6 4 : 3 2 9 10 13 14 14
6 6 : 3 3 14 15 20 21 21
6 8 : 3 4 19 20 27 28 28
8 4 : 4 2 13 14 17 18 18
8 6 : 4 3 20 21 26 27 27
8 8 : 4 4 27 28 35 36 36
也就是说,对于 (4,6) 的情况,索引是 (8, 9, 14, 15),而对于 (6,4) 的情况,索引是 (9, 10, 13, 14)。
对于偶数,2 是一个精确的除数,所以我认为在 Python 2(整数除法会截断)和 Python 3(不会截断)中,使用 / 得到的结果是一样的。或者你可以使用 //
操作符来确保进行截断除法。
另外,你可以通过像 (rows|cols)&1
这样的表达式来测试 rows
和 cols
是否为偶数,如果其中一个是奇数,结果是1,否则是0。