Python 如何在国际象棋比赛中猜皇后的位置
我最近参加了一个编程比赛,我能及时回答七个问题中的六个。最后一个问题是:从用户那里取一个数字,根据给定的数字的力量制作一个棋盘,放置尽可能多的皇后,并以一种方式排列皇后,使它们不会在水平、垂直和对角方向上相互威胁。例如,如果用户输入4,则4x416国际象棋棋盘中会有4个皇后。对于垂直和水平部分,我能够检查它们是否在同一列中,对于对角线部分,我使用了非常糟糕的while循环组合,然后将国际象棋游戏中所有保留的位置添加到列表中。问题是,我使用随机模块生成索引,然后检查它们是否在保留的数字中,然后重试,直到它不在那里。因此,发生的情况是,这个国际象棋游戏只有几个组合,如果开始的索引错误,程序几乎永远卡在while循环中。我曾想过从最后一行到第一行,但即使如此,我仍然使用随机索引。我怎样才能让程序计算皇后区的位置,而不是仅仅随机地输入一个数字,然后看看它是否有效?我的代码:如果我的代码有其他错误,请指出:Python 如何在国际象棋比赛中猜皇后的位置,python,python-3.x,chess,n-queens,python-chess,Python,Python 3.x,Chess,N Queens,Python Chess,我最近参加了一个编程比赛,我能及时回答七个问题中的六个。最后一个问题是:从用户那里取一个数字,根据给定的数字的力量制作一个棋盘,放置尽可能多的皇后,并以一种方式排列皇后,使它们不会在水平、垂直和对角方向上相互威胁。例如,如果用户输入4,则4x416国际象棋棋盘中会有4个皇后。对于垂直和水平部分,我能够检查它们是否在同一列中,对于对角线部分,我使用了非常糟糕的while循环组合,然后将国际象棋游戏中所有保留的位置添加到列表中。问题是,我使用随机模块生成索引,然后检查它们是否在保留的数字中,然后重试
这是一个相当著名的难题,被称为N皇后问题。这是一般的情况 有几个,包括这个非常优雅的: 从itertools导入置换 n=8 科尔斯=兰根 对于置换SCOL中的vec: 如果n==lensetvec[i]+i表示cols中的i\ ==lensetvec[i]-i表示cols中的i: 打印向量 : 对于表示为每行有一个皇后的向量的解决方案,我们不必检查两个皇后是否在同一行上。通过使用置换生成器,我们知道向量中没有重复的值,因此我们不必检查两个皇后是否在同一列上。由于车的移动不需要检查,我们只需要检查主教的移动 检查对角线的技术是从每个条目中加上或减去列号,因此同一对角线上的任何两个条目将具有相同的值。换句话说,每个对角线的和或差是唯一的。现在我们要做的就是确保八个皇后的对角线是不同的。因此,我们将它们放在一个集合中,以消除重复项,并检查集合长度是否为8,是否删除了重复项 任何对角线不重叠的置换都是一个解。所以,我们打印它并继续检查其他排列
这是一个相当著名的难题,被称为N皇后问题。这是一般的情况 有几个,包括这个非常优雅的: 从itertools导入置换 n=8 科尔斯=兰根 对于置换SCOL中的vec: 如果n==lensetvec[i]+i表示cols中的i\ ==lensetvec[i]-i表示cols中的i: 打印向量 : 对于表示为每行有一个皇后的向量的解决方案,我们不必检查两个皇后是否在同一行上。通过使用置换生成器,我们知道向量中没有重复的值,因此我们不必检查两个皇后是否在同一列上。由于车的移动不需要检查,我们只需要检查主教的移动 检查对角线的技术是从每个条目中加上或减去列号,因此同一对角线上的任何两个条目将具有相同的值。换句话说,每个对角线的和或差是唯一的。现在我们要做的就是确保八个皇后的对角线是不同的。因此,我们将它们放在一个集合中,以消除重复项,并检查集合长度是否为8,是否删除了重复项 任何对角线不重叠的置换都是一个解。所以,我们打印它并继续检查其他排列
这是一个巧妙的解决方案!谢谢@RichardTowers引用它。哇!这是如此的干净和简单!非常感谢!这是一个巧妙的解决方案!谢谢@RichardTowers引用它。哇!这是如此的干净和简单!非常感谢!
import random
# in the program you had to put '1' as the position of the queens and put '0' as the empty places on the board
# and also, if the user entered a number less than 4 the combination would not have been possible
num = int(input("Enter number: "))
if num >= 4:
arr = [[0 for _ in range(num)] for _ in range(num)]
reserved_num = []
oblique = []
for i in range(num):
j = random.randint(0, num - 1)
while [i, j] in reserved_num:
j = random.randint(0, num - 1)
arr[i][j] = 1
for rows in range(num):
reserved_num.append([rows, j])
if i < num-1:
inc = 0
if j == num-1:
while j-inc > 0 and i+inc < num-1:
inc += 1
oblique.append([i+inc, j-inc])
else:
inc = 0
elif j == 0:
while j+inc < num-1 and i+inc < num-1:
inc+= 1
oblique.append([i+inc, j+inc])
else:
inc = 0
else:
while j+inc < num-1 and i+inc < num-1:
inc+= 1
oblique.append([i+inc, j+inc])
else:
inc = 0
while j-inc > 0 and i+inc < num-1:
inc += 1
oblique.append([i+inc, j-inc])
else:
inc = 0
for res in oblique:
reserved_num.append(res)
for items in arr:
print(items)
else:
print("Not Possible! ")