先看岛屿的最大面积这道题目,再来做迷宫题
first_row = list(map(int, input().strip().split())) rows = first_row[0] cols = first_row[1] p = first_row[2] maze = [list(map(int, input().strip().split())) for _ in range(rows)] # 把体力值放到栈中,便于后续操作 stack = [[0, 0, p]] trace = [] # 当栈不为空的时候,说明还有格子没有被遍历到,也就是说路径还没走到头 while stack: cur_i, cur_j, value = stack.pop(0) # 判断边界值条件,判断是否是障碍物,如果不满足条件,就跳过下面的代码,返回到出栈过程 if cur_i < 0 or cur_i > rows - 1 or cur_j < 0 or cur_j > cols - 1 or maze[cur_i][cur_j] != 1: continue # 用trace列表是为了获得轨迹,这个轨迹就是通往终点过程中格子值为1的坐标,里面可能会有很多其它不必要的坐标 trace.append([cur_i, cur_j, value]) # 将走过的格子值置为0,防止重复计算,那就真的走不出去了 maze[cur_i][cur_j] = 0 # 如果value<0,说明体力值不够了,那直接跳出循环 if value < 0: print("Can not escape!") break # 如果成功到达终点,那么就要对trace处理了,找出最短路径是什么 if cur_i == 0 and cur_j == cols - 1: # 先取中trace中每个元素的坐标(即前两个元素),组成一个新列表 trace_temp = [ele[0:2] for ele in trace] # 将新列表逆序排列,为什么这么做?是因为我在找最短路径的时候注意到一个规律 # 最短路径上的任一点和该点前后元素的横纵坐标是满足一个条件的,这个条件就是下面代码中的if语句 # 不过从起点开始用这个规律会出问题,因为点可能会走到死胡同里而到不了终点 # 但是从终点开始用这个规律就一定没问题 trace_temp.reverse() s_trace = [trace_temp[0]] # id0是s_trace的索引,id1是trace_temp的索引 id0 = 0 id1 = 1 while id1 < len(trace_temp): ele = s_trace[id0] ele_next = trace_temp[id1] if (ele_next[0] == ele[0] + 1 and ele[1] == ele_next[1]) or ( ele_next[0] == ele[0] - 1 and ele[1] == ele_next[1]) or ( ele_next[1] == ele[1] + 1 and ele[0] == ele_next[0]) or ( ele_next[1] == ele[1] - 1 and ele[0] == ele_next[0]): s_trace.append(ele_next) id0 += 1 id1 += 1 # 生成了s_trace之后再逆序排列 s_trace.reverse() # 程序输出是字符串,而且是没有空格的字符串,值得注意 print(str(s_trace)[1:-1].replace(' ','')) break # 广度优先搜索, for di, dj, dvalue in [[0, 1, -1], [0, -1, -1], [-1, 0, -3], [1, 0, 0]]: # 每次移动之前的初始体力值都是当前位置的体力值,这个值得注意 value0 = value next_i, next_j = cur_i + di, cur_j + dj # 在小青蛙移动的时候也要对体力值进行操作 value0 += dvalue stack.append([next_i, next_j, value0])