解决思路

上一篇文章描写的八皇后问题中,一个难点就在于如何判断棋盘上指定位置的对角线上是否已经有皇后棋子。

这个问题的实质是如何在一个有限二维平面(8*8)上遍历一个指定坐标点(x,y)的对角线上的所有点。

注:平面的坐标系,y轴横向右侧延伸(→),x轴在y轴下侧竖向下延伸(↓)

一个点的对角线有四个方向,分别是左上、右上、左下、右下

如果用坐标的变化趋势来表示这四个方向的话,这个问题就显得一目了然了:

  1. 左上:x轴坐标与y轴坐标相对于点(x,y)都在递减
  2. 右上:x轴坐标在递减,y轴坐标在递增
  3. 左下:x轴坐标在递增,y轴坐标在递减
  4. 右下:x轴坐标与y轴坐标相对于点(x,y)都在递增

另:由于各个方向上的点都是相连的(都在各自的直线上),所以同一方向的点之间x、y轴坐标的增、减步长都是1

这样的话,对于(x,y)这个点:

  1. 用一个循环(i:0~x 递增)来遍历左上和右上两个方向
    (这两个方向的x轴坐标都在递减,由于i在递增,可以用x-i来实现递减,递减下限为0)

  2. 可以用一个循环(i:0~MAXNUM-x-1 递增 MAXNUM为上限)来遍历左下和右下两个方向
    (这两个方向的x轴坐标都在递增,由于i在递增,可以用x+i来实现递增,递增上限为MAXNUM-1)


代码如下:

MAXNUM = 8

chess = [[0 for col in range(MAXNUM)] for row in range(MAXNUM)]

#寻找指定点(x,y)的对角线上的点以及十字方向上的点
def find_catercorner(x,y):
    for i in range(x):
        #寻找左上方向的点
        if (y-1-i >= 0):
            chess[x-1-i][y-1-i] = 1
        #寻找右上方向的点
        if (y+1+i < MAXNUM):
            chess[x-1-i][y+1+i] = 1

    for i in range(MAXNUM-x-1):
        #寻找左下方向的点
        if (y-1-i >= 0):
            chess[x+1+i][y-1-i] = 1
        #寻找右下方向的点
        if (y+1+i < MAXNUM):
            chess[x+1+i][y+1+i] = 1

    #当前点的十字方向上的点
    for i in range(MAXNUM):
        chess[x][i]=1;
        chess[i][y]=1;

#重置棋盘
def clear_chess():
    for i in range(MAXNUM):
        for j in range(MAXNUM):
            chess[i][j] = 0

# 打印棋盘
def print_chess(x,y):
    for i in range(MAXNUM):
        for j in range(MAXNUM):
            #指定的点用X表示
            if i == x:
                if j == y:
                    print('X',' ',end='')
                    continue

            if chess[i][j] == 1:
                #对角线上的点用实心方块表示
                print('■',' ',end='')
            else:
                #非对角线上的点用空心方块表示
                print('□',' ',end='')
        print('\n')
    print('\n')

# 寻找指定点的对角线元素,打印棋盘,清空棋盘
def do_find(x,y):
    find_catercorner(x,y)
    print_chess(x,y)
    clear_chess()

def main():
    do_find(1,1)
    do_find(2,3)
    do_find(4,5)
    do_find(7,4)

if __name__ == '__main__':
    main()

运行结果

点(1,1)的对角线元素:

点(2,3)的对角线元素:

点(4,5)的对角线元素:

点(7,4)的对角线元素:

One thought on “python 如何遍历二维平面中指定点的对角线上的点”

  1. My programmer is trying to convince me to move to .net
    from PHP. I have always disliked the idea because of the
    costs. But he’s tryiong none the less. I’ve been using Movable-type on a variety of websites
    for about a year and am nervous about switching to another platform.
    I have heard very good things about blogengine.net.
    Is there a way I can transfer all my wordpress content into it?
    Any kind of help would be really appreciated! http://brand.chinascript.ru/home.php?mod=space&uid=74&do=profile&from=space

发表评论

电子邮件地址不会被公开。 必填项已用*标注