| Run ID | 作者 | 问题 | 语言 | 测评结果 | 时间 | 内存 | 代码长度 | 提交时间 |
|---|---|---|---|---|---|---|---|---|
| 83059 | sh25_shenpy | 蓝桥杯赛迷宫 | Python3 | 通过 | 27 MS | 3820 KB | 2955 | 2026-01-20 22:06:12 |
def main(): import sys sys.setrecursionlimit(1000000) # 增加递归深度限制,避免递归过深报错 # 1. 读取输入 n, m = map(int, input().split()) grid = [] for _ in range(n): line = input().strip() grid.append(list(line)) # 字符顺序:L→Q→B→S→L,用字典记录下一个需要找的字符 next_char = { 'L': 'Q', 'Q': 'B', 'B': 'S', 'S': 'L' } # 记录是否找到无限循环 has_infinite = False # 记忆化缓存:dp[(i,j,c)] 表示在(i,j)位置,当前要找字符c时的最大次数 dp = {} # 访问标记:visited[(i,j,c)] 标记DFS中是否正在访问该状态(用于检测环) visited = {} # 2. 深度优先搜索函数 def dfs(i, j, current_target): nonlocal has_infinite # 边界判断:坐标越界 或 当前位置字符不是目标字符,返回0 if i < 0 or i >= n or j < 0 or j >= m or grid[i][j] != current_target: return 0 # 检测环:如果当前状态正在访问中,说明存在无限循环 state = (i, j, current_target) if state in visited and visited[state]: has_infinite = True return -1 # 标记无限循环 # 记忆化:如果已经计算过该状态,直接返回结果 if state in dp: return dp[state] # 标记当前状态为正在访问 visited[state] = True max_count = 0 # 遍历上下左右四个方向 directions = [(-1, 0), (1, 0), (0, -1), (0, 1)] for dx, dy in directions: ni, nj = i + dx, j + dy # 下一个要找的字符 next_target = next_char[current_target] # 递归搜索下一个位置 res = dfs(ni, nj, next_target) if has_infinite: # 发现无限循环,直接返回 return -1 # 如果当前是S→L,说明完成了一次LQBS,次数+1 if current_target == 'S': max_count = max(max_count, res + 1) else: max_count = max(max_count, res) # 标记当前状态访问结束 visited[state] = False # 缓存当前状态的结果 dp[state] = max_count return max_count # 3. 遍历所有L的位置,作为起始点 max_result = 0 for i in range(n): for j in range(m): if grid[i][j] == 'L': # 从L开始,目标字符是L,下一步找Q current_res = dfs(i, j, 'L') if has_infinite: print(-1) return max_result = max(max_result, current_res) # 4. 输出结果 print(max_result) if __name__ == "__main__": main()