我是一名计算机科学专业的学生,我的任务是制作随机的8x8 - 皇后拼图排列,并将皇后区放在不同的栏目中但不是全部排在同一行。我非常接近我希望代码执行的操作,但我将所有问题都放在了我不想要的同一行中。你可以帮助我吗,我尝试了一些不同的东西,但只是为了远离它
以下是代码和输出:
import pprint
import random
grid = [['-']*8 for n in range(8)]
insertPoint = random.randrange(1,8)
for i in range(0,8):
for j in range(0,8):
if i==insertPoint:
grid[i][j] = 'Q'
pprint.pprint(grid)
[['-', '-', '-', '-', '-', '-', '-', '-'],
['-', '-', '-', '-', '-', '-', '-', '-'],
['-', '-', '-', '-', '-', '-', '-', '-'],
['Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q'],
['-', '-', '-', '-', '-', '-', '-', '-'],
['-', '-', '-', '-', '-', '-', '-', '-'],
['-', '-', '-', '-', '-', '-', '-', '-'],
['-', '-', '-', '-', '-', '-', '-', '-']]
答案 0 :(得分:2)
import pprint
import random
grid = [['-']*8 for n in range(8)]
for i in range(0,8):
insertPoint = random.randrange(1,8)
for j in range(0,8):
if j==insertPoint:
grid[j][i] = 'Q'
pprint.pprint(grid)
[['-', '-', '-', '-', '-', '-', '-', '-'],
['Q', '-', 'Q', '-', '-', '-', '-', '-'],
['-', '-', '-', '-', '-', '-', '-', 'Q'],
['-', '-', '-', 'Q', '-', '-', '-', '-'],
['-', '-', '-', '-', 'Q', '-', '-', '-'],
['-', '-', '-', '-', '-', '-', '-', '-'],
['-', '-', '-', '-', '-', 'Q', '-', '-'],
['-', 'Q', '-', '-', '-', '-', 'Q', '-']]
答案 1 :(得分:0)
注意,每行必须有一个女王。
另请注意,放置了几个皇后后,您只能使用空列,因此请跟踪已用完的列。
最后,跟踪已用完的对角线,这样你就可以消除哈希表中的新女王,而不是对所有放置的女王进行查询。
记住这些,最好的数据结构是使用几组 - 而不是矩阵,用于董事会和女王职位。
这是一个采用所有这些想法并生成非攻击女王职位的代码。
n=8
rows=set(range(n))
cols=set(range(n))
diags1=set(range(2*n+1))
diags2=set(range(2*n+1))
entries=set()
count=0
def Possibilities():
r=count
for c in cols:
if r-c+n-1 in diags1 and r+c in diags2:
yield ((r,c))
def AddQueen(r,c):
global count
entries.add((r,c))
rows.remove(r)
cols.remove(c)
diags1.remove(r-c+n-1)
diags2.remove(r+c)
count+=1
def RemoveQueen(r,c):
global count
entries.remove((r,c))
rows.add(r)
cols.add(c)
diags1.add(r-c+n-1)
diags2.add(r+c)
count-=1
solcount=0
def PrintSoln():
for r in range(n):
for c in range(n):
print(' Q' if (r,c) in entries else ' .',end='')
print()
print()
def Solve():
global solcount
for (r,c) in list(Possibilities()):
AddQueen(r,c)
if count==n:
solcount+=1
PrintSoln()
else:
Solve()
RemoveQueen(r,c)
Solve()
print(solcount)
答案 2 :(得分:-1)
好吧那很简单:在网格[j] [i] ='Q'时,将行保存到另一个数组中,该数组存储一个女王所占据的每一行。此外,您需要进行while循环,因为您需要迭代,直到随机生成器找到一个好的值:
// I don't know python, so the syntax might be weird
bool takenRows[8] = {false};
for (int i = 0; i < 8; ++i)
int currentRow = 0;
do
currentRow = rand(0, 8); // 8 exclusive
if (!takenRows[currentRow])
grid[i][currentRow] = 'Q';
takenRows[currentRow] = true;
while(takenRows[currentRow])
请注意网格如何使用grid [] []管理行和列。