将8个皇后放入棋盘(不互相攻击)![我想要所有可能的结果!]
我想在棋盘上放置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个解法。