【问题标题】:Eight queens puzzle - diagonal patterns八皇后拼图-对角线图案
【发布时间】:2021-08-27 06:11:36
【问题描述】:

我是编程新手,最近开始学习 Python。在练习使用 Loop 和解决八皇后谜题时,我很难找到检查对角线攻击的方法。我希望你能帮助我解决对角线模式。谢谢!

这是我到目前为止所写的:

A = []
for I in range(0,8):
    A.append([0,0,0,0,0,0,0,0])
for I in range(1,8):
    Valid = False
    while not Valid:
        S = input('Enter position'+ str(I) +' : ')
        X = int(S[0])-1
        Y = int(S[2])-1
        Valid = True
        for J in range(1,8):
            if A[X][J] > 0:
                Valid = False
            if A[J][Y] > 0:
                Valid = False
        if not Valid:
            print('Invalid Position!')
        else:
            A[X][Y] = 1

print(A)

【问题讨论】:

  • 我不知道国际象棋谜题,所以我不能真正告诉你要做什么,但我想建议对于棋盘,你可以使用 (8,8) NumPy 数组的嵌套列表。它更简洁一些,因为它具有固定的形状和尺寸,而列表可以以您不希望的方式进行更改。它看起来会有些不同,你创建一个像A = numpy.zeros((8, 8), dtype = numpy.int8),你索引像A[X, Y]int8 是可能的最小数据类型,取值范围为 -128 到 127。对于 6 种类型的棋子来说绰绰有余,而 +/- 可以指示哪一边。
  • 好像是单人棋局,没有发现敌人的移动,那么,你想从哪里检测对角线攻击呢?
  • @Ghost Ops 是的,先生。一个玩家占据了整个 8x8 棋盘。目标是在它们无法互相攻击的情况下放置尽可能多的蜂王。
  • @BatWanneBe 感谢您的评论。我还没有学过 NumPy,但我一定会研究一下。

标签: python


【解决方案1】:

一个很好的描述方法是不检查A,而是检查一组采取的行。例如,新皇后将采用“第 3 行”和“对角线 5”等。对角线可以用 X+Y 和 X-Y 编号。检查新皇后要使用的四行是否尚未使用,如果没有,请更新 A 和已使用的行集。

A = []
for I in range(0,8):
    A.append([0,0,0,0,0,0,0,0])
taken = set()
for I in range(1,8):
    while True:
        S = input('Enter position'+ str(I) +' : ')
        X = int(S[0])-1
        Y = int(S[2])-1
        take = {('row', X),
                ('column', Y),
                ('diagonal', X+Y),
                ('antidiagonal', X-Y)}
        if take & taken:
            print('Invalid Position!')
        else:
            A[X][Y] = 1
            taken |= take
            break
print(A)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-27
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    相关资源
    最近更新 更多