python - Python3多次使用相同的输入运行相同的函数,但每次产生不同的输出
问题描述
我目前正在尝试用 python 解决一个简单版本的检查器。具体来说,我正在尝试解决 USACO 2008 年 12 月铜牌比赛中的“跳棋”问题。(问题链接)
我的想法是在每个国王的位置上运行递归 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, n, graph, path, 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, n, graph, path, 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, n, graph, path, 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, n, graph, path, count-1, visited)
except IndexError as e: pass
return path
这是我调用 dfs 函数的方式:
print(dfs(7, 2, n, grid.copy(), [], count, set()))
print(dfs(7, 2, n, grid.copy(), [], count, set()))
print(dfs(7, 2, n, grid.copy(), [], count, set()))
这是我得到的输出:
这是我的完整代码:
n = int(input())
grid = []
for i in range(n):
grid.append(list(input().rstrip()))
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, n, graph, path, 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, n, graph, path, 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, n, graph, path, 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, n, graph, path, count-1, 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, 2, n, grid.copy(), [], count, set()))
print(dfs(7, 2, n, grid.copy(), [], count, set()))
print(dfs(7, 2, n, grid.copy(), [], count, set()))
解决方案
.copy()
list 方法仅适用于列表的一个“层” 。由于grid
是列表列表,因此如果您更改副本,原始内容仍会更改。
例如,在 Python 控制台中尝试
>>> a = [[1,2,3], [4,5,6], [7,8,9]]
>>> b = a.copy()
>>> b
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> b[0][0] = 5
>>> a
[[5, 2, 3], [4, 5, 6], [7, 8, 9]]
你看到它a
已经改变了,尽管b
被设置为a.copy()
. 您将需要制作某种形式的“双重”副本。
或者,使用模块中的deepcopy
函数copy
:
>>> from copy import deepcopy
>>> a = [[1,2,3], [4,5,6], [7,8,9]]
>>> b = deepcopy(a)
>>> b[0][0] = 5
>>> a
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
推荐阅读
- r - 如何将列的特定值与R中的特定值相乘
- javascript - 尝试使用 this.activateRoute.snapshot.params.id 时,Ctx.post 未定义
- mysql - AWS Lambda 会自动关闭 MySQL 连接吗?
- rest - Express REST API 和 multer 单文件更新中间件的单元和集成测试
- raku - 有没有办法只使用预编译模块
- web - 有效载荷格式 FCM 推送通知 web
- laravel - Laravel - 如何使用 Laravel 权限创建基于公司的用户角色
- forms - Quasar (Vue.js) q-form 不验证子组件中的输入
- visual-studio - 无法调试面向 .NET 5.0 的 Azure 函数
- amazon-web-services - 尝试使用 AWS SES API 发送电子邮件时出现“NotAuthorizedException/”