I am currently trying to solve a simple version of checkers with python. Specifically, I am trying to solve the problem “checkers” from USACO 2008 December Bronze contest. (Problem Link)
My idea is to run a recursive dfs function on the location of each of the kings. However, I have encountered some issues with my dfs function. When I run my dfs function multiple times, the function produces different outputs, even with the same parameters. Specifically, it only produces the right outputs in the first time. I don’t know what is happening, any help will be appreciated, thank you! (I am using Python 3.7)
Here is my dfs function:
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
Here is how I called my dfs function:
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()))
Here is the output I am getting:
Here is my full code:
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()))
Advertisement
Answer
The .copy()
list method will only work on one “layer” of the list. Since grid
is a list of lists, the original will still be changed if you change the copy.
For example, try in the Python console
>>> 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]]
You see that a
has changed, despite b
being set to a.copy()
. You will need to make some form of a “double” copy.
Alternatively, use the deepcopy
function from copy
module:
>>> 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]]