需要一点帮助来完成这段代码

时间:2015-06-21 00:27:48

标签: python

我是一名计算机科学专业的学生,​​我的任务是制作随机的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'],
     ['-', '-', '-', '-', '-', '-', '-', '-'],
     ['-', '-', '-', '-', '-', '-', '-', '-'],
     ['-', '-', '-', '-', '-', '-', '-', '-'],
     ['-', '-', '-', '-', '-', '-', '-', '-']]

3 个答案:

答案 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 [] []管理行和列。