计算游戏棋盘中间四个方格的平方数的算法?

0 投票
1 回答
502 浏览
提问于 2025-04-17 17:57

我正在用Python 3.3创建一个控制台版本的黑白棋(也叫反转棋)。现在我在制作棋盘,用户需要输入一个在4到16之间的偶数行数和偶数列数。请问我该如何写一个函数或者算法,来确定用户定义的棋盘中间的四个格子,以便放置最初的四个棋子呢?谢谢!

1 个回答

0

假设行数和列数分别是 rowscols 的值,那么我们要用的行号是 rows/2-1rows/2。比如说,如果 rows==12,那么这两个值就是5和6。同样,列号也是 cols/2-1cols/2

需要注意的是,如果把棋盘看作一个线性数组,并且每一行的单元格是相邻存储的,你可以用 lr =(rows+1)*cols//2 来表示中心单元格,并初始化单元格 'lr'、lr-1lr-colslr-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 这样的表达式来测试 rowscols 是否为偶数,如果其中一个是奇数,结果是1,否则是0。

撰写回答