小学生蓝桥杯Python闯关 | 移动方格
Posted COCOgsta
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小学生蓝桥杯Python闯关 | 移动方格相关的知识,希望对你有一定的参考价值。
学习Python从娃娃抓起!记录下蓝桥杯Python学习和备考过程中的题目,记录每一个瞬间。
附上汇总贴:小学生蓝桥杯Python闯关 | 汇总_COCOgsta的博客-CSDN博客
【题目描述】
有一个N*M的矩阵,且矩阵中每个方格中都有一个整数(0≤整数≤100),小蓝需要按照以下要求从矩阵中找出一条最长的移动路线,且输出最长路线的长度(1个方格为1个长度)。
要求: 1.小蓝可以从矩阵中任意一个方格开始向它的上、下、左、右相邻的任意一个方格移动,且移动的路线不能有交叉; 2.小蓝每次所要移动到的方格中的整数都要小于当前所在方格中的整数(如当前所在的方格中的整数为3,那么可以移动到数字为0,1,2的格子里,不可以移动到数字为3,4,5...的格子里);
例如:N=3,M=3,矩阵方格如下: 最长路线为4 -> 3 -> 2 -> 1,故路线长度为4。
【输入描述】
第一行输入两个正整数N,M(1<N≤1000,1<M≤1000),N表示矩阵的行数,M表示矩阵的列数,两个正整数之间以一个空格隔开
第二行开始输入N行,每行包含M个整数(0≤每个整数≤100),表示每个方格中的整数,每个整数之间以一个空格隔开
【输出描述】
输出一个整数,表示最长路线的长度
【样例输入】
3 3
1 1 3
2 3 4
1 1 1
【样例输出】
4
【代码详解】
matrix = input().split(" ")
N = matrix[0]
M = matrix[1]
res = []
times = []
for i in range(int(N)):
ans = input().split(" ")
res.append(ans)
def dfs(res, N, M, i, j, num, k, flag):
# print("开始尝试,坐标为",i,j,"移动次数",k)
if k != 0:
if i<0 or i>=int(N) or j<0 or j>=int(M) or res[i][j]>=num or flag[i][j]:
# print("尝试失败,继续移动")
return False
flag[i][j] = True
num = res[i][j]
if (dfs(res, N, M, i-1, j, num, k+1, flag)
or dfs(res, N, M, i+1, j, num, k+1, flag)
or dfs(res, N, M, i, j-1, num, k+1, flag)
or dfs(res, N, M, i, j+1, num, k+1, flag)):
return True
flag[i][j] = False
times.append(k)
return False
def hasPath():
flag = []
for i in range(3):
flag.append([])
for j in range(3):
flag[i].append(False)
for i in range(int(N)):
for j in range(int(M)):
num = res[i][j]
if dfs(res, N, M, i, j, num, 0, flag):
return True
times.sort()
print(times[-1] + 1)
return False
if __name__ == '__main__':
hasPath()
复制代码
【运行结果】
3 3
1 1 3
2 3 4
1 1 1
4
以上是关于小学生蓝桥杯Python闯关 | 移动方格的主要内容,如果未能解决你的问题,请参考以下文章