美文网首页
八皇后问题

八皇后问题

作者: 萌萌Msy | 来源:发表于2018-03-21 21:51 被阅读0次

    课堂上老师讲了广度优先搜索算法后让课下实现下八皇后问题,就突发奇想了很多实现方法,这里只把我的实现方式和实现代码粘出来,效果不算好,但能找到解,思想如下:
    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))   
    

    以上实现虽然能找到解但不能找到所有解,可做大量优化,实现方式比较多,此方法仅供参考,后期会继续改进优化。

    相关文章

      网友评论

          本文标题:八皇后问题

          本文链接:https://www.haomeiwen.com/subject/xevnqftx.html