【发布时间】:2017-05-31 16:06:20
【问题描述】:
这个想法是尝试通过将皇后完全随机地放置在棋盘的每一行中来尝试解决“皇后问题”,并查看解决它需要多少次重复。棋盘可以是任意大小。
我的想法是创建 s 个列表,每个列表包含 s 个“空”字符(下划线)。然后为每一行随机选择一个位置来插入女王(“I”值),然后标记下面和对角向下的所有位置(我将逐行进行,所以我不必为上面的行而烦恼) 与 X。如果在任何迭代中随机选择的皇后位置与该行中任何 X 的位置匹配,我从头开始新的棋盘。
我有类似的东西,但它似乎卡在第 19 行(标有注释),但它没有给我任何错误。有什么问题?另外,我的解决方案(除了那条线)是否正确?
from random import *
#Success flag
success = 0
#Trials counter
trials = 0
s = input ("enter board size\n")
s = int(s)
block = 1 #blockade
queen = 2 #queen
board = [[0 for x in range(s)] for y in range(s)]
while success == 0:
for y in range (0, s-1):
pos = randint(0,s-1) #line 19
if board[y][pos] != block:
board[y][pos] = queen
a = 1
for z in range (y, s-2):
board[z + 1][pos] = block
if pos - a >= 0:
board[z + 1][pos - a] = block
if pos + a <= s-1:
board[z + 1][pos + a] = block
a = a + 1
success = 1
else:
success = 0
#Printing board
for y in range (0, s-1):
print (board[y])
print ("Number of trials:\n")
print (trials)
【问题讨论】:
-
“请完成我的代码”不是问题。
-
我一直在处理代码和帖子。我希望现在好些了吗?
-
似乎太复杂了。放置的皇后自然由一对数字表示,例如(2,3) 表示第 2 行第 3 列。给定 2 个皇后 (a,b) 和 (c,d),很容易判断它们是否可以互相攻击,而无需“标记”每个皇后攻击的所有方格。如果它们在同一行或同一列上,则微不足道。对于对角线的情况——只需计算连接皇后的线的斜率。是+/- 1吗?如果是这样 - 他们可以攻击。
-
如果您真的开始随机放置皇后直到找到解决方案,您的程序可能不会在宇宙不复存在之前停止。您正在查看 64^8 = 281474976710656 个可能的完全随机的皇后位置,其中只有 92 个是解决方案
-
@IrmendeJong 我认为您误读了“将皇后完全随机放置在棋盘的每一行”的问题(强调我的)。你让我很好奇。我刚刚实现了它,并且能够在几秒钟内得到解决方案。甚至随机放置 8 也不是没有希望的:64 选择 8 = 4426165368 并将其除以 92 表明,平均而言,棋盘上 8 个不同位置的大约 5000 万个选择中的 1 个将是一个解决方案。