一、一步之遥。
1. 考点:思维
2. 难度:⭐⭐
3. 要点分析:无。
import sys
import os
import math
steps = [97, -127]
for i in range(1,100):
word = 0
for j in range(1,100):
if steps[0]*i + steps[1]*j == 1:
print(i+j)
word = 1
break
if word:
break
二、凑平方数。
1. 考点:DFS
2. 难度:⭐⭐⭐
3. 要点分析:这是一个较为暴力的思路。
import sys
import os
import math
# 获得所有组合
numsets = []
def dfs(number):
# 终止条件:找完所有的数字
if number==9876543210:
return
for i in range(10):
s = str(i)
if s not in number:
number += str(s)
numsets.append(number)
dfs(number)
number = number[:-1]
for i in range(1,10):
dfs(str(i))
numsets.append(str(i))
numsets.append('0')
# 检验平方数
numbers = []
for num in numsets:
if int(math.sqrt(int(num)))**2==int(num):
numbers.append(num)
# 开始分组
groupsets = []
def groupdivide(tmp):
# 终止条件:满足0~9
if len(''.join(tmp))==10:
if sorted(tmp) not in groupsets:
groupsets.append(sorted(tmp))
return
for num in numbers:
if len(set(''.join(tmp)+num))==len(''.join(tmp)+num): #无重复数字
tmp.append(num)
groupdivide(tmp)
tmp.pop(-1)
for num in numbers:
groupdivide([num])
print(len(groupsets))
三、棋子换位。
(由于为C语言代码填空,本题略过)
四、机器人塔。
1. 考点:DFS
2. 难度:⭐⭐⭐
3. 要点分析:
经分析,“从下往上”逆推比较好做;与此同时,只要确定了最后一行,整个“机器人塔”都确定了。
因此,①确定机器人塔的行数,第n行有n个元素;②根据行数,确定最后一行元素的所有情况;③利用“dfs”由下往上逆推,看该情况是否成立,成立则ans+=1。
import sys
import os
import math
m, n = map(int, input().split())
ans = 0
def dfs(a, b, line):
global ans
# 终止条件:人员使用完毕
if a==0 and b==0:
ans += 1
return
# 边界条件:人员短缺
if a<0 or b<0:
return
# 从下往上逆推
tmp = []
for i in range(len(line)-1):
if line[i]==line[i+1]:
tmp.append(0)
else:
tmp.append(1)
dfs(a-(len(tmp)-sum(tmp)),b-sum(tmp),tmp)
# 确定行数: row,每行有row个元素
for i in range(1,n+m):
k = i
if k*(1+k)/2==n+m:
row = i
break
# 列出所有的情况
lastLines = []
def caseall(tmp):
if len(tmp)==row:
lastLines.append(tmp[:])
return
for t in [0,1]:
tmp.append(t)
caseall(tmp)
tmp.pop(-1)
for t in [0,1]:
caseall([t])
# 检验每种情况的可行性
for lastLine in lastLines:
dfs(m-(len(lastLine)-sum(lastLine)),n-sum(lastLine),lastLine)
print(ans)