📜  火灾逃生路线 codechef (1)

📅  最后修改于: 2023-12-03 15:11:09.449000             🧑  作者: Mango

火灾逃生路线 - Codechef

简介

本文将介绍如何解决 Codechef 上的火灾逃生路线问题。这个问题可以用基本的搜索算法来解决。本文将提供一个完整的解决方案,包括输入格式、输出格式、示例输出和代码实现。

问题描述

你在一个假想的建筑物里面,这个建筑物是一个矩形,被分成了很多个格子。每个格子都被一些人占据着。现在发生了火灾,你需要找到一条安全的逃生路线,使得从起点到终点的距离最短,并且这条路线不能穿过已经着火的格子。在本问题中,我们假定你只能向左、右、上、下四个方向行走。另外,输入数据保证有解。

输入格式

第一行包含两个整数 $R$ 和 $C$,表示建筑物的行数和列数。接下来 $R$ 行,每行包含 $C$ 个字符,表示整个建筑物的图像。其中 . 表示空地,# 表示已经着火的格子,S 表示起点,G 表示终点。输入保证只有一个起点和一个终点。

输出格式

输出一个整数,表示从起点到终点的最短距离。

示例输入
3 3
S#.
#G.
...
示例输出
3
步骤
  1. 读入输入数据
  2. 找到起点坐标和终点坐标
  3. 使用广度优先搜索算法(BFS)寻找从起点到终点的最短路径,不考虑已经着火的格子
  4. 输出最短路径的长度
代码实现
from collections import deque 

# 读入输入数据
R, C = map(int, input().split())
table = []
for i in range(R):
    table.append(input())

# 找到起点和终点
start_x, start_y, end_x, end_y = None, None, None, None
for i in range(R):
    for j in range(C):
        if table[i][j] == 'S':
            start_x, start_y = i, j
        elif table[i][j] == 'G':
            end_x, end_y = i, j

# 找到从起点到终点的最短路径
visited = [[False] * C for _ in range(R)]
visited[start_x][start_y] = True 
queue = deque([(start_x, start_y, 0)])
while queue:
    x, y, steps = queue.popleft()
    if x == end_x and y == end_y:
        print(steps)
        break
    for dx, dy in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
        nx, ny = x + dx, y + dy
        if 0 <= nx < R and 0 <= ny < C and \
           table[nx][ny] != '#' and not visited[nx][ny]:
            visited[nx][ny] = True 
            queue.append((nx, ny, steps + 1))

以上是完整的 Python 代码实现,可以在 Codechef 上直接运行。