九宫格最大的数
题目描述
九宫格中的数字1-9,每个格子可以向上、下、左、右、原地不动五个方向移动,matrix中的每一项表示方向限制,如matrix=[[1,2],[9,9]],表示1不能向2移动,9不能原地不动,M表示matrix的长度,N表示移动最大的步数,求在给定步数中,得到最大的数
#coding=utf-8
# 本题为考试多行输入输出规范示例,无需提交,不计分。
import sys
matrix = []
M,N = 0,0
m = [[1,2,3],[4,5,6],[7,8,9]]
def valid(row1,col1,row2,col2):
# 首先检查位置有效性
if row2>=0 and row2<=2 and col2>=0 and col2<=2:
pass
else:
return False
# 其次检查方向有效性
if [m[row1][col1],m[row2][col2]] in matrix:
return False
else:
return True
res = []
def backtrack(row,col,times,value):
if times == 0:
res.append(value)
return
else:
if valid(row,col,row-1,col):#向上走
value = value*10+m[row-1][col]
backtrack(row-1, col, times-1, value)
value = value//10
if valid(row,col,row+1,col):#向下走
value = value * 10 + m[row +1][col]
backtrack(row + 1, col, times-1, value)
value = value // 10
if valid(row,col,row,col-1):#向左走
value = value * 10 + m[row][col-1]
backtrack(row,col-1, times-1, value)
value = value // 10
if valid(row,col,row,col+1):#向右走
value = value * 10 + m[row][col+1]
backtrack(row,col+1, times-1, value)
value = value // 10
if valid(row,col,row,col):#原地不动
value = value * 10 + m[row][col]
backtrack(row,col, times-1, value)
value = value // 10
if __name__ == "__main__":
# 读取第一行的n
# matrix = []
# M = int(sys.stdin.readline().strip())
# for i in range(M):
# # 读取每一行
# line = sys.stdin.readline().strip()
# # 把每一行的数字分隔后转化成int列表
# values = list(map(int, line.split()))
# matrix.append(values)
# N = int(sys.stdin.readline().strip())
M = 8
N= 2
matrix = [[1, 2], [4, 4], [7, 8], [8, 5], [8, 7], [9, 6], [9, 8], [9, 9]]
for i in range(3):
for j in range(3):
# 从当前位置快开始走N步
backtrack(i,j,N,m[i][j])
print(max(res))
总结:
考察回溯法
需要对位置有效性和方向有效性进行判断
回溯法的重点:当完成一步的时候返回上一搜索空间后,需要出变量状态进行还原