题目
马走日字形,有多少种途径可以遍历棋盘上的所有的点。
其中,先输入一个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为该组数对应的路径有几条。