课堂上老师讲了广度优先搜索算法后让课下实现下八皇后问题,就突发奇想了很多实现方法,这里只把我的实现方式和实现代码粘出来,效果不算好,但能找到解,思想如下:
1.在8*8的的坐标中随机生成一个点
2.找到这个随机点虽有不可能的点(所有横轴、竖轴、对角线)
3.逐行扫描坐标轴每个点(若此点不在impossiable_point中则添加到结果集result中并找到此点不可能的点并加入到impossiable_point中)
4.循环以上步骤直到找到八个点才算成功(因为可能找到小于八个点算法就结束了)
代码如下:
'''
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 = []
'''保存所有不可能的点'''
def func(x, y):
for i in range(8):
impossible_points.append([x,i])
impossible_points.append([i,y])
'''左下的不可能的点'''
for i in range(8):
if(x-i>0 and y-i>0):
impossible_points.append([x-i-1, y-i-1])
'''右下的不可能的点'''
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])
'''右上角不可能的点'''
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__':
'''随机生成一个点'''
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))
以上实现虽然能找到解但不能找到所有解,可做大量优化,实现方式比较多,此方法仅供参考,后期会继续改进优化。