先绘制一个棋盘并用来来保存结果
#绘制棋盘并保存求解结果
def plot_chess(result):
global num
mat=np.zeros((8,8))
for i in range(8):
for j in range(8):
if result[i]==j:
mat[i,j]=1
elif (i+j)%2==0:
mat[i,j]=-1
else:
mat[i,j]=0
my_cmap=matplotlib.colors.LinearSegmentedColormap.from_list('my_camp',['white','black','deeppink'],3)
plt.imshow(mat,cmap=my_cmap)
plt.title("第"+str(num)+"种解法",fontsize=16)
plt.xticks([])
plt.yticks([])
plt.savefig('D:/myself/算法/eight_queen/'+str(num)+'.png') #保存图片的路径
在某一个位置放置皇后
def Queen_set(n):
global num
if n==8:
print("第"+str(num)+"种:",queen_list)
plot_chess(queen_list)
num+=1
return
else:
for i in range(8):
if check(n,i):
queen_list.append(i) #在当前位置放置皇后
Queen_set(n+1) #递归,进入下一层搜索
queen_list.pop() #回溯关键点,清除前一步的错误数据
判断是否符合条件
#index表示目前摆放的位置
def check(depth,index):
if depth==0:
return True
else:
for i in range(depth):
if queen_list[i] == index: #判断列是否符合
return False
#判断对角线规则是否符合
elif index==queen_list[i]-depth+i or index==queen_list[i]+depth-i:
return False
return True
最后将输出的结果转化成动图
def create_gif(image_list, gif_name, duration=0.35):
frames = []
for image_name in image_list:
frames.append(imageio.imread(image_name))
imageio.mimsave(gif_name, frames, 'GIF', duration=duration)
return
def main():
image_list = ['D:/myself/算法/eight_queen/'+str(i)+'.png' for i in range(1,93)]
gif_name = 'D:/myself/算法/eight_queen/eight_queen.gif'
duration = 0.35
create_gif(image_list, gif_name, duration)
if __name__ == '__main__':
main()
调用函数
queen_list=[]
num = 1
Queen_set(0)
效果展示

博客详细介绍了如何通过Python实现八皇后问题的可视化过程,包括绘制棋盘、放置皇后、条件判断,并最终将解决方案转化为动态图进行展示。
401

被折叠的 条评论
为什么被折叠?



