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)