微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python3 多次使用相同的输入运行相同的函数,但每次都会产生不同的输出

如何解决Python3 多次使用相同的输入运行相同的函数,但每次都会产生不同的输出

我目前正在尝试用 python 解决一个简单版本的跳棋。具体来说,我正在尝试解决 USACO 2008 年 12 月铜牌比赛中的“跳棋”问题。 (Problem Link)

我的想法是在每个国王的位置上运行一个递归的dfs函数。但是,我的 dfs 函数遇到了一些问题。当我多次运行 dfs 函数时,即使参数相同,该函数也会产生不同的输出。具体来说,它只在第一时间产生正确的输出。我不知道发生了什么,任何帮助将不胜感激,谢谢! (我使用的是 Python 3.7)

这是我的 dfs 函数

def dfs(x,y,n,graph,path,count,visited):
    if str([x+1,y+1]) not in visited:
        visited.add(str([x+1,y+1]))
        if count == 0:
            path += [[x+1,y+1]]
            return path
        if x < 0 or y < 0 or x > n or y > n:
            return path
        path += [[x+1,y+1]]
        try:
            if graph[x+1][y+1] == "o":
                graph[x+1][y+1] = "+"
                return dfs(x+2,y+2,count-1,visited)
        except IndexError as e: pass
        try:
            if graph[x+1][y-1] == "o":
                graph[x+1][y-1] = "+"
                return dfs(x+2,y-2,visited)
        except IndexError as e: pass
        try:
            if graph[x-1][y+1] == "o":
                graph[x-1][y+1] = "+"
                return dfs(x-2,visited)
        except IndexError as e: pass
        try:
            if graph[x-1][y-1] == "o":
                graph[x-1][y-1] = "+"
                return dfs(x-2,visited)
        except IndexError as e: pass
        return path

这是我如何调用我的 dfs 函数

print(dfs(7,2,grid.copy(),[],set()))
print(dfs(7,set()))

这是我得到的输出

enter image description here

这是我的完整代码

n = int(input())
grid = []
for i in range(n):
    grid.append(list(input().rstrip()))
def dfs(x,visited)
        except IndexError as e: pass
        return path

count = 0
Ks = []
for x in range(n):
    for y in range(n):
        if grid[x][y] == "K":
            Ks.append([x,y])
        if grid[x][y] == "o":
            count += 1
print(dfs(7,set()))

解决方法

.copy() 列表方法仅适用于列表的一个“层”。由于 grid 是一个列表列表,如果您更改副本,原始内容仍将更改。

例如,在 Python 控制台中尝试

>>> a = [[1,2,3],[4,5,6],[7,8,9]]
>>> b = a.copy()
>>> b
[[1,9]]
>>> b[0][0] = 5
>>> a
[[5,9]]

您看到 a 已更改,尽管 b 已设置为 a.copy()。您需要制作某种形式的“双重”副本。

或者,使用 deepcopy 模块中的 copy 函数:

>>> from copy import deepcopy
>>> a = [[1,9]]
>>> b = deepcopy(a)
>>> b[0][0] = 5
>>> a
[[1,9]]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。