解题思路:
1.BFS遍历所有状态,储存状态及其对应的步数;
2.发现和结果吻合则退出。
注意事项:
1.使用字典存储某一状态和对应步数,便于查找重复状态,降低时间复杂度;
2.不要使用列表存储状态,因为列表不能作为字典键值,而应用字符串;
3.“跳杯”的过程可以用列表实现。
参考代码:
def bfs(): global start, end, cache_state, around stack = [start] while stack: temp_state = stack.pop(0) idx = temp_state.index('*') for i in around: if 0 <= idx + i < len(start) and temp_state[idx + i] != '*': temp = list(temp_state) temp[idx], temp[idx + i] = temp[idx + i], temp[idx] a = "".join(temp) if a not in cache_state: cache_state.setdefault(a, cache_state[temp_state] + 1) stack.append(a) if a == end: return cache_state[a] start, end = [input() for _ in range(2)] cache_state = {start: 0} around = [-3, -2, -1, 1, 2, 3] print(bfs())
0.0分
4 人评分
import os import sys from collections import deque import copy start = input() target = input() result = 0 def bfs(): global result q = deque([[start,0]]) while q: A,n = q.popleft() if A == target: print(n) break empty = A.index("*") for i in [-3,-2,-1,1,2]: x = i+empty if 0<=x<len(start): B = list(A) a = B[x] B[x] = "*" B[empty] = a q.append(["".join(B),n+1]) bfs() 请问我这个代码为什么会内存超限
C语言训练-亲密数 (C语言描述,反正怎么都能对)浏览:2256 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:522 |
哥德巴赫曾猜测 (C语言代码)浏览:778 |
C语言程序设计教程(第三版)课后习题4.9 (Java代码)浏览:630 |
管理学院的人数 (Java代码)浏览:560 |
P1001 (Java代码)浏览:740 |
循环链表与单个结点删除浏览:1115 |
Manchester- A+B for Input-Output Practice (II)浏览:1366 |
WU-IP判断 (C++代码)(一种有趣的实现方法)浏览:1574 |
Hello, world! (C语言代码)浏览:805 |