Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用递归构建映射?_Python_Recursion - Fatal编程技术网

Python 使用递归构建映射?

Python 使用递归构建映射?,python,recursion,Python,Recursion,我正在编写一个程序,导入符号地图并递归导航地图。它已经完成了,几乎可以用了,但不管出于什么原因,地图总是跳过一个点,我也不知道为什么。它应该用“X”标记正确的路径,而不使用“+”的部分。如果有人可以检查这一点,并找到一个错误,我错过了,这将是非常感谢 我要穿过的网格 看起来像这样: 当您使用网格运行代码时,它也会保留一些字符不变,并且无论我将代码放在何处,它都会完全忽略它。我试着把一些东西放进去,比如: for i in grid: for j in i: if j =

我正在编写一个程序,导入符号地图并递归导航地图。它已经完成了,几乎可以用了,但不管出于什么原因,地图总是跳过一个点,我也不知道为什么。它应该用“X”标记正确的路径,而不使用“+”的部分。如果有人可以检查这一点,并找到一个错误,我错过了,这将是非常感谢

我要穿过的网格 看起来像这样:

当您使用网格运行代码时,它也会保留一些字符不变,并且无论我将代码放在何处,它都会完全忽略它。我试着把一些东西放进去,比如:

for i in grid:
    for j in i:
        if j == "|":
            j = "+"
        if j == "#":
            j = "+"
我运行它的代码是:

grid = []

def buildGrid ():
    with open("Maze.txt" , "r") as f:
        for line in f:
            chars = []
            for c in line:
                if c != "\n":
                    chars.append(c)
            grid.append(chars)    
    freeMouse(0, 0)

def showPath ():
    result = ""
    for i in grid:
        for j in i:
            result += " "
            result += j
        result += "\n"
    print(result)

def freeMouse (x, y):
    if grid[y][x] == "O":
        grid[0][0] = "S"
        showPath()
    elif grid[y][x] == "X":
        return False
    elif grid[y][x] == ("|"):
        grid[y][x]= "+"
        return False
    elif grid[y][x] == ("+"):
        return False
        print("false")
    grid[y][x] = "X"
    if x != 0:
        if y != 0:
            left = freeMouse (x-1, y)
            up = freeMouse(x, y -1)
            if len(grid) == y + 1:
                if len(grid[y]) != x+1:
                    right = freeMouse (x + 1, y)
                    if not right:
                        grid[y][x+1] = "+"
            else:
                if len(grid[y]) == x+1:
                    down = freeMouse(x, y+1)
                else:
                    down = freeMouse(x, y+1)
                    right = freeMouse (x + 1, y)
                    if not right:
                        grid[y][x+1] = "+"
                if not down:
                    grid[y+1][x] = "+"
            if not up:
                grid[y-1][x] = "+"
            if not left:
                grid[y][x-1] = "+"
        else:
            if len(grid[y])== x + 1:
                left = freeMouse (x-1, y)
                down = freeMouse (x, y+1)
            else:
                left = freeMouse (x-1, y)
                down = freeMouse (x, y+1)
                right = freeMouse (x+1, y)
                if not right:
                    grid[y][x+1] = "+"
            if not down:
                grid[y+1][x] = "+"
            if not left:
                grid[y][x-1] = "+"
    else:
        if y != 0:
            if len(grid) == y + 1:
                up = freeMouse(x,y-1)
                right = freeMouse (x+1, y)
            else:
                up = freeMouse(x, y-1)
                down = freeMouse(x, y+1)
                right = freeMouse(x + 1, y)
                if not down:
                    grid[y+1][x] = "+"
            if not up:
                grid[y-1][x] = "+"    
        else:
            down = freeMouse(x, y+1)
            right = freeMouse(x+1, y)
            if not down:
                grid[y+1][x] = "+"


buildGrid()

我试着运行你的代码,得到了以下输出

 S X + + X X X X X X
 X + + X + X + + + X
 + X + + + X | # + X
 + X X X X X # # + X
 + + + + + | | | + X
 + + | + X X X X + X
 + + + X X | + X X X
 + + + X X # | + + +
 + + + + X + + X X X
 + + + + X X X X + O
我看到一些未经处理的备件。 我觉得问题在于返回语句——您应该记住‘notnone==True’ 您可以通过打开python控制台并键入以下命令来测试这一点

def func():
    return
print not func(); // This returns true
因此,我建议删除“if not up”、“if not down”等语句

if grid[y][x] == "O":
    grid[0][0] = "S"
    showPath()
# To stop from endless recursion -- don't go back to traversed path
elif grid[y][x] == "X":
    return False
# Don't run into wall
elif grid[y][x] == ("|"):
    grid[y][x]= "+"
    return False
# Don't run into locations already not traversable
elif grid[y][x] == ("+"):
    grid[y][x]= "+"
    return False
    print("false")
# Mark path as traversed
grid[y][x] = "X"

# If not at left end -- to avoid boundary issues
if x != 0:
    # If not at top end
    if y != 0:
        left = freeMouse (x-1, y)
        up = freeMouse(x, y -1)

        # If at bottom end
        if len(grid) == y + 1:
            # If not at right end -- traverse right
            if len(grid[y]) != x+1:
                right = freeMouse (x + 1, y)

        # If not at bottom end
        else:
            # If at right end -- traverse down
            if len(grid[y]) == x+1:
                down = freeMouse(x, y+1)
            # If not at right end -- traverse down or right
            else:
                down = freeMouse(x, y+1)
                right = freeMouse (x + 1, y)
    # If you are at top end
    else:
        # If you are at right end
        if len(grid[y])== x + 1:
            # Traverse left or down
            left = freeMouse (x-1, y)
            down = freeMouse (x, y+1)
        else:
            # Traverse left, down, or right
            left = freeMouse (x-1, y)
            down = freeMouse (x, y+1)
            right = freeMouse (x+1, y)
# If you are at left end
else:
    # If you aren't at top end
    if y != 0:
        # If you are at right end
        if len(grid) == y + 1:
            # Try to traverse right or up
            up = freeMouse(x,y-1)
            right = freeMouse (x+1, y)
        else:
            # Try to traverse up, down, right
            up = freeMouse(x, y-1)
            down = freeMouse(x, y+1)
            right = freeMouse(x + 1, y)
    # If you are at top end
    else:
        # Try to traverse down or right
        down = freeMouse(x, y+1)
        right = freeMouse(x+1, y)
如果需求只是从开始导航到结束,我觉得您可以大大简化代码

def freeMouse (x, y):
    if x < 0 or y < 0 or y+1 > len(grid)  or x+1 > len(grid[y]):
        return
    if grid[y][x] == "O":
        grid[0][0] = "S"
        showPath()
    elif grid[y][x] == "X":
        return 
    elif grid[y][x] == ("|"):
        grid[y][x]= "+"
        return
    elif grid[y][x] == ("+"):
        return

    grid[y][x] = "X"
    freeMouse(x-1,y)
    freeMouse(x+1,y)
    freeMouse(x,y-1)
    freeMouse(x,y+1)

    return 
def自由鼠标(x,y):
如果x<0或y<0或y+1>len(网格)或x+1>len(网格[y]):
返回
如果网格[y][x]=“O”:
网格[0][0]=“S”
showPath()
elif网格[y][x]=“x”:
返回
elif网格[y][x]==(“|”)为:
网格[y][x]=“+”
返回
elif网格[y][x]==(“+”):
返回
网格[y][x]=“x”
自由鼠标(x-1,y)
自由鼠标(x+1,y)
自由鼠标(x,y-1)
自由鼠标(x,y+1)
返回
但话说回来,我不太确定你的要求。
如果上述解决方案不适用于您,请告知我

请提供您正在使用的输入文件,以便问题重现。另外,发布你得到的结果。你的代码有很多问题。函数
freeMouse
从不返回
True
;唯一的返回值是
False
None
。返回语句之后有一个无法访问的print语句。连续多次调用freeMouse而不检查返回值,这意味着您的程序可以在找到迷宫路径后继续查找迷宫路径。您给出的第一个代码段没有任何作用,因为您修改了循环变量,而不是网格。如果你认为代码“几乎可以工作”,那你就错了。我建议你首先在概念原子函数中定义/重构部分代码,然后在组合它们之前独立测试每个函数。这会给你一个逐步解决问题的方法。