Python--马走日棋盘问题

题目

马走日字形,有多少种途径可以遍历棋盘上的所有的点。

其中,先输入一个N,N为测试数据的个数,接下来会有N行为四个整数,前两个为棋盘的行数和列数,后两个为马的起始位置横纵坐标。

方法

回溯算法

代码

N=int(input())
lst=[]
for _ in range(N):
    m,n,a,b=map(int,input().split())
    lst.append([m,n,a,b])
for i in range(N):
    m=lst[i][0]
    n=lst[i][1]
    a=lst[i][2]
    b=lst[i][3]
    dirs=[(1,2),(2,1),(1,-2),(2,-1),(-1,2),(-2,1),(-1,-2),(-2,-1)]
    board=[[0]*n for _ in range(m)]
    cnt=0
    def move(i,j,step):
        global cnt
        if i<0 or i>=m or j<0 or j>=n:
            return 0
        if step==m*n:
            cnt+=1
            return
        for k in range(8):
            next_x=i+dirs[k][0]
            next_y=j+dirs[k][1]
            if next_x>=0 and next_y>=0 and next_x<m and next_y<n and board[next_x][next_y]==0:
                board[next_x][next_y]=1
                move(next_x,next_y,step+1) #递归
                board[next_x][next_y]=0 #回溯
    board[a][b]=1
    move(a,b,1)
    print(cnt)

cnt为该组数对应的路径有几条。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值