将8个皇后放入棋盘(不互相攻击)![我想要所有可能的结果!]

-1 投票
4 回答
1295 浏览
提问于 2025-04-17 14:35

我想在棋盘上放置8个皇后(或者说是大臣),确保它们之间互不威胁!
就像这张图片一样。

首先,
我想用一种程序化的方法来实现,但似乎这行不通!
(如果能成功的话,代码会变得很长,可能有几百行!)

我的代码

def viz(a):
    for i in range(8):
        temp = []
        if(i == a or i == a - 1 or i == a + 1):
            continue
        temp.append(i)
    temp = set(temp)
    return temp
list1=[0]*8
for i in range(8):
    list1[i]=1
    a = viz(i)
    for j in a:
        list2[j]=1
        b = viz(j)
        for h in a.intersection(b):
            list3[h]=h
            tset = a.intersection(b)
            c = viz(h)
            for n in tset.intersection(c):
                list4[]
                .
                .
                .
        list2[j]=0
    list1[i]=0

我甚至尝试了面向对象的编程风格,但也没有成功。

4 个回答

0

我在使用这么多模块的时候遇到了一些问题,所以这是我的解决方案:

res = []
ill = []

def n_ligal(r,c):
    global ill
    a = 1
    while(r+a<8):
        ill.append((r+a,c))
        ill.append((r+a,c+a))
        ill.append((r+a,c-a))
        a += 1          
def r_iligal(r,c):
    global ill
    a = 1
    while(r+a<8):
        ill.remove((r+a,c))
        ill.remove((r+a,c+a))
        ill.remove((r+a,c-a))
        a += 1

def a():
    global i,j
    j = res.pop()
    i -= 1
    r_iligal(i,j)
    j+=1
    if(j==8):
        a()

i = 0
j = 0
while(i<8):
    while (j<8):
        if((i,j) not in ill):
            res.append(j)
            n_ligal(i,j)
            if(len(res) == 8):
                print(res)
            i += 1
            j = 0
            break
            elif(j==7):
                a()
            else:
                j += 1

print('Press Q to exit')
q = input()
if(q=='q'):
    raise SystemExit
0

这里有一个可能的解决方案,使用仅仅六行Python代码就解决了这个问题,详细内容可以查看这个链接

3

这是众多可能实现方式中的一种:

#! /usr/bin/python3.2

import itertools

def queens ():
    for p in itertools.permutations (range (8) ):
        yield [x for x in enumerate (p) ]

for q in queens ():
    err = False
    for a, b in ( (a, b) for a in q for b in q if a [0] < b [0] ):
        if abs (a [0] - b [0] ) == abs (a [1] - b [1] ):
            err = True
            break
    if not err: print (q)

它会生成所有92个解法。

撰写回答