题目描述
这题应该是一个经典的BFS,一开始根本没有思路,看了题解,发现大佬们做的时候都是以“空格”为移动对象,于是我也这么做 定眼一看,二维数组嘛~但是跟着大佬走学了新的一招,将一维数组转成二维数组,将二维数组转成一维数组 一维转二维:xn = index//3,yn = index%3 二维转一维:index = xn * 3 + yn 步数怎么记录呢?用一个字典吧,每次走一步都在上一步加一,key就是“状态” PS:这个题有地方很怪,至少我是看了案例才知道的,有一个案例是根本没有空格这个元素的,所以(至少)我用Python没有保证全过,作了一下弊,看了答案,写了个异常处理,姑且100分(不然会有一个无效返回的错误,87分)
代码实现
import collections
dir = [[0, 1], [1, 0], [0, -1], [-1, 0]]
dic = {}
def bfs():
"""
切换一维数组和二维数组,找到S中A和B交换位置的一种可能性,用字典保存在S’下的走的步数
:return: 输出当前S下的走的步数,步数从0开始
"""
que = collections.deque()
que.append(S)
dic[S] = 0
while que:
now = list(que.popleft())
if now.index('A') == indexB and now.index('B') == indexA:
return dic["".join(now)]
try:
space = now.index(" ")
except:
return 10
x, y = space // 3, space % 3
distance = dic["".join(now)]
for i in range(4):
xn, yn = x + dir[i][0], y + dir[i][1]
if xn in [0, 1] and yn in [0, 1, 2]:
keynow = now.copy()
keynow[space], keynow[xn * 3 + yn] = keynow[xn * 3 + yn], keynow[space]
if not dic.__contains__("".join(keynow)):
dic["".join(keynow)] = distance + 1
que.append(keynow)
return -1
if __name__ == '__main__':
s1 = input()
s2 = input()
S = s1 + s2
indexA = S.index('A')
indexB = S.index('B')
print(bfs())
至于为什么Python过不了没有空格的案例,我不知道是因为啥,难道是案例错了?
|