目的:
1. 掌握递归和排序
2. 掌握BFS与队列
3. 掌握DFS和递归
4. 熟悉并理解回溯问题
实验内容:
1.在五星图案节点填上数字:1~12,不包括7和11。
要求每条直线上数字和相等。
如图就是一个恰当的填法。
请搜索所有可能的填法有多少种。
1.思路
用上面给的10个不同的数字放入数组,进行全排列,一种排列对应一颗五角星,这里五角星的10个点与数组的10个下标对应,然后把对应直线上的数字算出来看看是否相等。如果相等ans加一。最后要去掉旋转和镜像的情况就是ans/10。
class demo:
def __init__(self):
self.lis = [1, 2, 3, 4, 5, 6, 8, 9, 10, 12]
self.ans = 0
def check(self,arr): #判断是否符合要求
a1 = arr[0] + arr[2] + arr[5] + arr[8]
a2 = arr[0] + arr[3] + arr[6] + arr[9]
a3 = arr[1] + arr[2] + arr[3] + arr[4]
a4 = arr[1] + arr[5] + arr[7] + arr[9]
a5 = arr[4] + arr[6] + arr[7] + arr[8]
if a1 == a2 and a1 == a3 and a1 == a4 and a1 == a5:
return True
else:
return False
def dfs(self,lis,k): #全排列
if k == len(lis):
if self.check(self.lis) == True:
self.ans += 1
# print(self.ans )
else:
for i in range(k,len(lis)):
lis[i],lis[k] = lis[k],lis[i]
self.dfs(lis,k+1)
lis[i], lis[k] = lis[k], lis[i]
def run(self):
self.dfs(self.lis,0)
print(self.ans / 10) #去掉重复的情况然后打印
if __name__ == '__main__':
d = demo()
d.run()
结果为12。
2.一个长方形的房间,铺着方砖,每块砖是 #或黑点. 。一个人站在黑砖上,可以按上、下、左、右方向移动到相邻的砖。他不能在#上移动,他只能在黑砖上移动。起点是@,要求:遍历所有黑点。
2.思路
用列表存储地图,地图上的每个位置对应列表的坐标。然后定义goto函数从起点去访问坐标,如果访问过就是把黑的变成#防止重复访问。
import time
map = [
['.','.','.','.','#'],
['.','.','.','.','.'],
['#','@','.','.','.'],
['.','#','.','.','#'],
]
direction = [
[1,0],
[-1,0],
[0,1],
[0,-1]
]
def its_out(x,y): #判断坐标是否出界
if not 0<= x <= 3 or not 0 <= y <= 4:
return True
else:
return False
def go_to(x,y): #前往坐标
if (its_out(x,y) or map[x][y] == '#'): #如果坐标是出界的或者为#则返回
return
else: #否则可以前往
for dire in direction: #遍历方向
map[x][y] = '#'
# 更新下一步坐标
next_x = x + dire[0]
next_y = y + dire[1]
if not its_out(next_x,next_y) and map[next_x][next_y] != '#': #判断下一步坐标是否问题
#打印当前地图
for i in map:
print(i)
print()
time.sleep(0.5)
go_to(next_x,next_y)#没问题就前往
else:#否则跳过
continue
go_to(2,1)
for i in map:
print(i)
3.
3.思路
将1到2020的数字转为字符串,然后全部存储在一个字符串里,然后遍历字符串,遇到2就ans++
s = ''
for i in range(1,2021):
s = s + str(i)
ans = 0
for i in s:
if i == '2':
ans += 1
print(ans)