递归算法 openjudge 百练 python

https://www.icourse163.org/learn/PKU-1001894005?tid=1450413466#/learn/content
程序设计与算法(二)算法基础

4147:汉诺塔问题(Hanoi)

# 4147:汉诺塔问题(Hanoi)
# http://bailian.openjudge.cn/practice/4147/

def move(num, sour, dest):
    print(num, end=':')
    print(sour, end='->')
    print(dest)


def hanoi(num, sour, tem, dest):
    if num == 1:
        move(num, sour, dest)
    else:
        hanoi(num - 1, sour, dest, tem)
        move(num, sour, dest)
        hanoi(num - 1, tem, sour, dest)
# (1)将A座上的n-1个盘子以C座为中转,移动到B座。
# (2)把A座最下面的一个盘子移动到C座。
# (3)将B座上的n-1个盘子以A座为中转,移动到C座。

n = input()
hanoi(int(n.split()[0]), n.split()[1], n.split()[2], n.split()[3])

2754:八皇后

# 2754:八皇后
# http://bailian.openjudge.cn/practice/2754


def queen(atry, row=0):
    if row == len(atry):  # 如果当前行==len(atry),那么第[0,len(atry)-1]行都正确,因此找到一个解
        result.append(list(atry))
    else:
        for col in range(len(atry)):
            atry[row] = col  #表示把第row行的皇后放在col列上
            ok = True  #冲突标记
            #判断第row行是否与第[0,row-1]行的皇后冲突
            for r in range(row):
                # 同一列 or 同一主对角线,横纵坐标之差相同 or 同一次对角线,横纵坐标之和相同
                if atry[r] == col or r - atry[r] == row - atry[
                        row] or r + atry[r] == row + atry[row]:
                    ok = False  ##冲突
                    break
            if ok:
                # 如果 把第row行的皇后放在col列上 冲突,那么继续循环,尝试下一列
                # 如果 把第row行的皇后放在col列上 可以,那么尝试下一行
                queen(atry, row + 1)

#所有的解决方案
result = []  
N = 8
queen([0] * N, 0)

# 输出
# 第1行是测试数据的组数n
n = int(input())
for i in range(n):
    result_index = int(input())
    answer = result[result_index - 1]
    for j in range(N):
        print(answer[j] + 1, end="")
    print()

2694:逆波兰表达式 未完成

# 2694:逆波兰表达式
# http://bailian.openjudge.cn/practice/2694


def expression():
    if express[0] == '+':
        express.pop(0)
        return expression() + expression()
    elif express[0] == '-':
        express.pop(0)
        return expression() - expression()
    elif express[0] == '*':
        express.pop(0)
        return expression() * expression()
    elif express[0] == '/':
        express.pop(0)
        return expression() // expression()
    else:
        num = float(express[0])
        express.pop(0)
        return num


express = input().split()
# print(express)
print("%lf" % expression())

4017:爬楼梯

# 4017:爬楼梯
# http://bailian.openjudge.cn/practice/4017/

def stairs(n):
    if n<0:
        return 0
    if n==0:
        return 1
    return stairs(n-1) + stairs(n-2)
    
# N = int(input())
# print(stairs(N))

while True:
    try:
        N = input()
    except EOFError:
        break
    N = int(N)
    print(stairs(N))

2753:菲波那契数列

# 2753:菲波那契数列
# http://bailian.openjudge.cn/practice/2753


def Fibonacci(n):
    if n == 1 or n == 2:
        return 1
    return Fibonacci(n - 1) + Fibonacci(n - 2)


# 第1行是测试数据的组数n
num = int(input())
while num > 0:
    N = int(input())
    print(Fibonacci(N))
    num -= 1

1664:放苹果

# 1664:放苹果
# http://bailian.openjudge.cn/practice/1664/

# M个同样的苹果放在N个同样的盘子,允许有的盘子空着不放
def f(m, n):
#     如果盘子比苹果多,那么必定有空盘子
#     因为哪个盘子空了都一样,所以拿掉一个空盘子之后,分法总数不变,所以可以拿掉所有空盘子
    if n > m: 
        return f(m, m)
    if m == 0: # 没苹果了,算作一种分法
        return 1
    if n <= 0: # 没盘子了
        return 0
#     n <= m时,总放法 = 有1个盘子为空的放法 + 没盘子为空的放法(每个盘子至少1个苹果,那么苹果还剩下(m - n)个)
    return f(m, n - 1) + f(m - n, n)

# 第一行是测试数据的数目t(0 <= t <= 20)
t = int(input())
while t>0:
    m, n = input().split()
    m = int(m)
    n = int(n)
    print(f(m, n))
    t -= 1

2787:算24 未完成

# 2787:算24
# http://bailian.openjudge.cn/practice/2787


def isZero(x):
    return abs(x) < 1e-6


def count24(num4, n):  # 用数组num4里的n个数,计算24
    if n == 1:
        if isZero(num4[0] - 24):
            return True
        else:
            return False

#     枚举两个数的组合
    for ii in range(0, n - 1):
        for jj in range(ii + 1, n):
            mm = 0  # 还剩下m个数,m = n - 2
            numrest = []
            for kk in range(0, n):
                if kk != ii and kk != jj:
                    numrest.append(num4[kk])  # 把其余数放入
                    mm += 1

            numrest.append(num4[ii] + num4[jj])
            if count24(numrest, mm + 1):
                numrest.pop()
                return True
            numrest.pop()

            numrest.append(num4[ii] - num4[jj])
            if count24(numrest, mm + 1):
                numrest.pop()
                return True
            numrest.pop()

            numrest.append(num4[jj] - num4[ii])
            if count24(numrest, mm + 1):
                numrest.pop()
                return True
            numrest.pop()

            numrest.append(num4[ii] * num4[jj])
            if count24(numrest, mm + 1):
                numrest.pop()
                return True
            numrest.pop()

            if not isZero(num4[ii]):
                numrest.append(num4[jj] / num4[ii])
                if count24(numrest, mm + 1):
                    numrest.pop()
                    return True
                numrest.pop()

            if not isZero(num4[jj]):
                numrest.append(num4[ii] / num4[jj])
                if count24(numrest, mm + 1):
                    numrest.pop()
                    return True
                numrest.pop()

        return False


# import time
# time_start=time.time()
while True:
    num4 = input().split()
    for ii in range(len(num4)):
        num4[ii] = int(num4[ii])
    if num4[0] == 0:
        break
    if count24(num4, len(num4)):
        print("YES")
#         print('totally cost',time.time()-time_start)
    else:
        print("NO")
#         print('totally cost',time.time()-time_start)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zzz的学习笔记本

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值