【蓝桥杯】【dfs】路径之谜

原题链接

n = int(input())
col_ = list(map(int,input().strip().split()))
row_ = list(map(int,input().strip().split()))
# 路径标配 记录矩阵
martix =[[0 for j in range(n)]for i in range(n)]
ans=[]
# 移动方式
move=[(-1,0),(1,0),(0,-1),(0,1)]
# 记录射击情况
rc_ = [[0 for i in range(n)] for j in range(2)]
rc_[0][0] +=1 
rc_[1][0] +=1 

def dfs(pos,rc_,pas):
    global ans
    if pos ==(n-1,n-1):
        if rc_[0] ==col_ and rc_[1] ==row_:
            ans =pas.copy()
           
        return
    else:
        for i in move:
            new_x = pos[0] +i[0]
            new_y = pos[1]+ i[1]
            if 0 <=new_x < n and 0<=new_y<n and not martix[new_x][new_y]:
                rc_[0][new_y] +=1 
                rc_[1][new_x] +=1 
                if rc_[0][new_y] >col_[new_y] or rc_[1][new_x]>row_[new_x]:
                    rc_[0][new_y] -=1 
                    rc_[1][new_x] -=1
                    continue
                martix[new_x][new_y] =1 
                pas.append((new_x,new_y))
                dfs((new_x,new_y),rc_,pas)
                rc_[0][new_y] -=1 
                rc_[1][new_x] -=1
                martix[new_x][new_y] =0
                pas.pop()
dfs((0,0),rc_,[(0,0)])

for i in ans:
    print(i[0]*n+i[1],end=' ')
# print(ans)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值