数据结构和算法(学习笔记七)(八皇问题代码需要改进)

数据结构和算法

1.递归

  • 斐波那契数列
  • 汉诺塔:
    def move(n, x, y, z):
        if n == 1:
            print(x, "-->", z)
        else:
            move(n - 1, x, z, y)    # 将n-1个盘子从x借助 z移到y上
            print(n, x, "-->", z)   # 将第n个盘子从x移到z上
            move(n - 1, y, x, z)    # 将n-1个盘子从y借助x移到z上
    move(3, "X", "Y", "Z")
    
    
  • 八皇后问题
    • 要把二维数组换行输出,更直观,用numpy是最简单方便的
    • (用了最笨的方法)应反复更改不断改进代码
import numpy as np

# checkerboard = 8 * [8 * [0]]
checkerboard = [[0 for i in range(8)] for i in range(8)]


# print(np.array(checkerboard))


def notDanger(row, j, rs_checkerboard):
    for i in range(row, 8):
        for a in range(8):
            rs_checkerboard[i][a] = 0
    # print(np.array(rs_checkerboard))
    flag1 = 0
    flag2 = 0
    flag3 = 0
    flag4 = 0
    # print("判读数组:", "[", row, ",", j, ']')
    # 判断列的方向
    for i in range(8):
        if rs_checkerboard[i][j] == 1:
            flag1 = 1
            # print("[", row, ",", j, ']', "列方向", "[", i, ",", j, ']', "的方向存在1", '不存入')
            break

    # 判断左上方
    for (i, a) in zip(range(row, -1, -1), range(j, -1, -1)):
        if rs_checkerboard[i][a] == 1:
            flag2 = 1
            # print("[", row, ",", j, ']', "左上方", "[", i, ",", a, ']', "的方向存在1", '不存入')
            break

    # 判断右下方
    for (i, a) in zip(range(row, 8), range(j, 8)):
        if rs_checkerboard[i][a] != 0:
            flag3 = 1
            # print("[", row, ",", j, ']', "右下方", "[", i, ",", a, ']', "的方向存在1", '不存入')
            break

    # 判断右上方
    for (i, a) in zip(range(row, -1, -1), range(j, 8)):
        if rs_checkerboard[i][a] != 0:
            flag4 = 1
            # print("[", row, ",", j, ']', "右上方", "[", i, ",", a, ']', "的方向存在1", '不存入')
            break

    if flag1 | flag2 | flag3 | flag4:
        return 0
    else:
        return 1


count = 0


def choice(row, n, checkerboard):
    rss_checkerboard = checkerboard
    # 递归截至条件
    global count
    if row == 8:
        count += 1
        print("第", count, "种方法")
        print(np.array(rss_checkerboard))



    else:
        # 判断这个位置是否 合理
        for j in range(n):
            # print(np.array(rss_checkerboard))
            if notDanger(row, j, checkerboard):
                # 判断
                # print("录入:", "[", row, ",", j, ']')
                rss_checkerboard[row][j] = 1
                # print(rss_checkerboard)
                choice(row + 1, n, rss_checkerboard)


choice(0, 8, checkerboard)

  • 注意事项 :
    1.global 问题 在函数外部已经定义了变量n,在函数内部对该变量进行运算,运行时会遇到了这样的错误:主要是因为没有让解释器清楚变量是全局变量还是局部变量
    2.python 对二维数组的创建 :

    checkerboard = [[0 for i in range(8)] for i in range(8)]   
    checkerboard = 8*[8*[0]]   
    

    的不同
    3.python 的自增

每日一题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值