課堂上老師講了廣度優(yōu)先搜索算法后讓課下實現(xiàn)下八皇后問題,就突發(fā)奇想了很多實現(xiàn)方法,這里只把我的實現(xiàn)方式和實現(xiàn)代碼粘出來,效果不算好,但能找到解,思想如下:
1.在8*8的的坐標(biāo)中隨機(jī)生成一個點(diǎn)
2.找到這個隨機(jī)點(diǎn)雖有不可能的點(diǎn)(所有橫軸、豎軸、對角線)
3.逐行掃描坐標(biāo)軸每個點(diǎn)(若此點(diǎn)不在impossiable_point中則添加到結(jié)果集result中并找到此點(diǎn)不可能的點(diǎn)并加入到impossiable_point中)
4.循環(huán)以上步驟直到找到八個點(diǎn)才算成功(因為可能找到小于八個點(diǎn)算法就結(jié)束了)
代碼如下:
'''
Created on 2018年3月20日
@author: yqm
'''
import random
import matplotlib.pyplot as plt
from matplotlib.axes._axes import Axes
plt.xlim(xmin=0, xmax=7)
plt.ylim(ymin=0, ymax=7)
impossible_points = []
result=[]
temp = []
'''保存所有不可能的點(diǎn)'''
def func(x, y):
for i in range(8):
impossible_points.append([x,i])
impossible_points.append([i,y])
'''左下的不可能的點(diǎn)'''
for i in range(8):
if(x-i>0 and y-i>0):
impossible_points.append([x-i-1, y-i-1])
'''右下的不可能的點(diǎn)'''
for i in range(8):
if(x+i<7 and y-i>0):
impossible_points.append([x+i+1, y-i-1])
for i in range(8):
if(x-i>0 and y+i<7):
impossible_points.append([x-i-1, y+i+1])
'''右上角不可能的點(diǎn)'''
for i in range(8):
if(x+i<7 and y+i<7):
impossible_points.append([x+i+1, y+i+1])
return impossible_points
if __name__ == '__main__':
'''隨機(jī)生成一個點(diǎn)'''
for i in range(100000):
randomPoint_x = random.randint(0,7)
randomPoint_y = random.randint(0,7)
func(randomPoint_x, randomPoint_y)
print(randomPoint_x, randomPoint_y)
# print(func(randomPoint_x, randomPoint_y))
# x = []
# y = []
# for i in range(len(impossible_points)):
# x.append(impossible_points[i][0])
# for i in range(len(impossible_points)):
# y.append(impossible_points[i][1])
# plt.plot(x,y,'ro')
# plt.show()
# print(randomPoint_x, randomPoint_y)
result.append([randomPoint_x, randomPoint_y])
for i in range(8):
for j in range(8):
a = [i,j]
if(a not in impossible_points):
result.append(a)
impossible_points = impossible_points + func(i,j)
# print(result)
if(len(result)==8):
x = []
y = []
for i in range(len(result)):
x.append(result[i][0])
for i in range(len(result)):
y.append(result[i][1])
plt.plot(x,y,'ro')
plt.show()
break
else:
impossible_points.clear()
result.clear()
# print(randomPoint_x,randomPoint_y)
# print(func(randomPoint_x, randomPoint_y))
以上實現(xiàn)雖然能找到解但不能找到所有解,可做大量優(yōu)化,實現(xiàn)方式比較多,此方法僅供參考,后期會繼續(xù)改進(jìn)優(yōu)化。