八皇后問題

課堂上老師講了廣度優(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)化。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 八皇后問題:在8*8的棋盤上放置8個皇后,保證任意兩個皇后之間不能相互攻擊。(即沒有兩個皇后是在同一行、同一類、或...
    五秋木閱讀 855評論 0 0
  • 問題介紹 摘自百度百科八皇后問題,是一個古老而著名的問題,是回溯算法的典型案例。該問題是國際西洋棋棋手馬克斯·貝瑟...
    逍遙wqy閱讀 1,255評論 0 0
  • 目錄[TOC] 問題分析: 相信八皇后規(guī)則的問題,大家都很熟悉,接下來是如何分析回溯法的應(yīng)用?;厮莘ㄅc圖里面的深度...
    maskwang520閱讀 3,318評論 0 5
  • 解決思路:遞歸/回溯 首先是從數(shù)據(jù)結(jié)構(gòu)的角度考慮如何記錄擺放:既然就是棋盤,就很容易想到用二維元祖來解這個問題,但...
    __XY__閱讀 3,027評論 0 0
  • 八皇后問題問題描述:八皇后問題,是一個古老而著名的問題,是回溯算法的典型案例。該問題是國際西洋棋棋手馬克斯·貝瑟爾...
    藥藥耀耀閱讀 2,185評論 0 0

友情鏈接更多精彩內(nèi)容