N=int(input())
north=list(map(int,input().split()))
west=list(map(int,input().split()))
maze=[[0]*N for i in range(N)]
visited=[[0]*N for i in range(N)]
count=0
for i in range(N):
for j in range(N):
maze[i][j]=count
count+=1
visited[i][j]=0
def backtrack(north,west,row,col,path,maze,visited,N):
west[row]-=1
north[col]-=1#
#每到一个地点就拔箭。逆向思维。
if maze[row][col]==(N*N-1):
if sum(west)==0 and sum(north)==0:
for i in path:
print(i,end=' ')#当符合条件的时候打印结果。
return
if (row+1)<=N-1:
if visited[row+1][col]==0:
if west[row+1]>=1 and north[col]>=1:#向下探索
path.append(maze[row+1][col])
visited[row+1][col]=1
backtrack(north,west,row+1,col,path,maze,visited,N)
west[row+1]+=1
north[col]+=1
visited[row+1][col]=0#返回原状。
path.remove(maze[row+1][col])
if col+1<=N-1:
if visited[row][col+1]==0:
if west[row]>=1 and north[col+1]>=1:#向右探索
path.append(maze[row][col+1])
visited[row][col+1]=1
backtrack(north,west,row,col+1,path,maze,visited,N)
west[row]+=1
north[col+1]+=1
visited[row][col+1]=0
path.remove(maze[row][col+1])
if row-1>=0:
if visited[row-1][col]==0:
if west[row-1]>=1 and north[col]>=1:#向上探索
path.append(maze[row-1][col])
visited[row-1][col]=1
backtrack(north,west,row-1,col,path,maze,visited,N)
west[row-1]+=1
north[col]+=1
visited[row - 1][col] = 0
path.remove(maze[row-1][col])
if col-1>=0:
if visited[row][col-1]==0:
if west[row]>=1 and north[col-1]>=1:#向左探索
path.append(maze[row][col-1])
visited[row][col-1]=1
backtrack(north,west,row,col-1,path,maze,visited,N)
west[row]+=1
north[col-1]+=1
visited[row][col - 1] = 0
path.remove(maze[row][col-1])
def walkpath(maze,visited,west,north,path,N):
visited[0][0]=1
backtrack(north,west,0,0,path,maze,visited,N)
path=[0]
walkpath(maze,visited,west,north,path,N)
这道题的关键在于逆向思维,拔出箭。
然后就是深入理解dfs算法,注意每次回溯完成都要恢复原状。然后就是判断条件要写正确。