#<27-.6>
2026-01-25 09:51:35
发布于:江苏
8阅读
0回复
0点赞
from collections import deque
import sys
def main():
data = sys.stdin.read().split()
if not data:
print(-1)
return
m = int(data[0])
graph = [[] for _ in range(10)] # 索引1-9使用
index = 1
# 构建无向图
for _ in range(m):
u = int(data[index])
v = int(data[index+1])
index += 2
graph[u].append(v)
graph[v].append(u)
# 读取8个数字的初始位置
p = list(map(int, data[index:index+8]))
index += 8
# 确定初始空顶点位置
full_set = set(range(1, 10))
used_set = set(p)
empty_start = full_set.difference(used_set).pop()
# BFS获取连通块
component = set()
queue_comp = deque([empty_start])
visited_comp = set([empty_start])
while queue_comp:
node = queue_comp.popleft()
component.add(node)
for neighbor in graph[node]:
if neighbor not in visited_comp:
visited_comp.add(neighbor)
queue_comp.append(neighbor)
# 检查连通性条件
if 9 not in component:
print(-1)
return
for i in range(1, 9):
start_pos = p[i-1]
if start_pos != i and (start_pos not in component or i not in component):
print(-1)
return
# 构建初始状态
state = [0] * 9
for num in range(1, 9):
pos = p[num-1]
state[pos-1] = num
start_state = tuple(state)
start_empty_index = empty_start - 1
# 目标状态
target = (1, 2, 3, 4, 5, 6, 7, 8, 0)
# BFS搜索最小步数
queue = deque()
queue.append((start_state, start_empty_index, 0))
visited = {start_state}
while queue:
state, empty_idx, steps = queue.popleft()
if state == target:
print(steps)
return
empty_vertex = empty_idx + 1 # 当前空顶点编号
for neighbor in graph[empty_vertex]:
nb_idx = neighbor - 1 # 邻接点索引
if state[nb_idx] == 0: # 跳过空顶点
continue
new_state = list(state)
# 移动数字到空顶点位置
new_state[empty_idx] = state[nb_idx]
new_state[nb_idx] = 0
new_state_tup = tuple(new_state)
if new_state_tup not in visited:
visited.add(new_state_tup)
queue.append((new_state_tup, nb_idx, steps + 1))
print(-1)
if __name__ == "__main__":
main()
这里空空如也







有帮助,赞一个