O cavalo quer o menor caminho.
Cada casa do tabuleiro vira um vértice. Cada movimento possível do cavalo vira uma aresta. A BFS explora o tabuleiro por distâncias crescentes até encontrar o destino.
Contexto do problema
Dados dois quadrados do tabuleiro, precisamos descobrir o menor número de movimentos do cavalo necessário para sair da origem e alcançar o destino.
Dois quadrados
Exemplo: e2 e4. O primeiro é a origem e o segundo é o destino.
Menor quantidade
Não basta encontrar um caminho. Precisamos garantir que seja o caminho com menos movimentos.
Número de movimentos
Imprimimos a frase pedida pelo problema com a distância encontrada.
f6 f6.
O tabuleiro é um grafo
Para resolver com grafos, basta reinterpretar o tabuleiro.
64 casas
Cada quadrado do tabuleiro representa um vértice.
a1, a2, ..., h8
Movimentos válidos
Existe uma aresta entre duas casas quando o cavalo pode ir de uma para a outra em um único movimento.
Os 8 movimentos possíveis do cavalo
O cavalo sempre faz um deslocamento em “L”: duas casas em um eixo e uma no outro.
movimentos = [
(2, 1),
(2, -1),
(-2, 1),
(-2, -1),
(1, 2),
(1, -2),
(-1, 2),
(-1, -2)
]
0 <= nx < 8 e 0 <= ny < 8.
Por que BFS?
A BFS percorre o grafo por camadas de distância.
Começa na origem
Origem entra na fila com distância 0.
Explora vizinhos
Todos os movimentos possíveis recebem distância +1.
Primeiro encontro
Quando o destino é retirado da fila, aquela distância é mínima.
BFS animada — e2 até e4
Este exemplo precisa de 2 movimentos. A animação mostra a expansão por camadas.
O mesmo exemplo como grafo
Cada bolinha é uma casa do tabuleiro. Cada linha é um movimento válido do cavalo que a BFS está considerando neste trecho.
Algoritmo em Python 3.11
from collections import deque def bfs(posA, posB): # Converte a posição do xadrez para índices 0..7 x = int(posA[1]) - 1 y = ord(posA[0]) - ord('a') a = int(posB[1]) - 1 b = ord(posB[0]) - ord('a') visited = [ [False] * 8 for _ in range(8) ] fila = deque() # (linha, coluna, distância) fila.append((x, y, 0)) visited[x][y] = True movimentos = [ (2, 1), (2, -1), (-2, 1), (-2, -1), (1, 2), (1, -2), (-1, 2), (-1, -2) ] while fila: linha, coluna, distancia = fila.popleft() # Primeiro momento em que o destino sai da fila: # encontramos a menor distância. if linha == a and coluna == b: return distancia for dx, dy in movimentos: nx = linha + dx ny = coluna + dy # Movimento continua dentro do tabuleiro? if 0 <= nx < 8 and 0 <= ny < 8: # Ainda não visitamos esta casa? if not visited[nx][ny]: visited[nx][ny] = True fila.append( (nx, ny, distancia + 1) ) while True: try: posA, posB = input().split() except EOFError: break resposta = bfs(posA, posB) print( f"To get from {posA} to {posB} takes " f"{resposta} knight moves." )
Entrada e saída do exemplo
Exemplo de entrada
Exemplo de saída
1 movimento
c3 é diretamente alcançável pelo cavalo a partir de b1.
6 movimentos
A BFS expande várias camadas até alcançar o destino.
0 movimentos
A origem já é o destino; a primeira posição retirada da fila resolve o caso.
O que o aluno precisa guardar
Modelagem
Casa = vértice. Movimento válido = aresta.
BFS
Explora por níveis usando uma fila.
Menor caminho
Em grafo não ponderado, a primeira distância encontrada pela BFS é mínima.
| Elemento do problema | Interpretação em grafos |
|---|---|
| Casa do tabuleiro | Vértice |
| Movimento do cavalo | Aresta |
| Quantidade de movimentos | Distância |
| Estrutura auxiliar | Fila |
| Algoritmo | BFS |