馬走日字 回溯法

2022-05-22 11:30:10 字數 1670 閱讀 3155

馬走日字問題,在n*m的棋盤中,馬只能走"日"字。馬從位置(x,y)出發,把棋盤的每一格都走一次且只走一次。找出所有路徑。 

這個問題可以用回溯法解,每一步都有八種可能的走法,設馬當前在(x,y)點,則它的可能走到:

(x+1,x+2),(x+1,x-2),(x-1,x+2),(x-1,x-2),(x+2,x+1),(x+2,x-1),(x-2,x+1),(x-2,x-1)

對每一種可能的走法試一遍,如果出界了或者已經走過了,則不用走了。試探一遍後,回溯。

python實現:

'''

horse rides sun problem

use backtracking algorithm

author:ztp

create at:2015/1/19 15:06

'''class horserides:

def __init__(self, n, m, x, y):

self.row = n

self.column = m

self.startx = x

self.starty = y

self.chessboard = [[0]*self.column for r in range(self.row+1)]

self.sunx = [1, 1, 2, 2,-1,-1,-2,-2]

self.suny = [2,-2, 1,-1, 2,-2, 1,-1]

self.chessboard[self.startx][self.starty] = 1;

self.count = 0;

def check(self, x, y):

if x >= self.row or y >= self.column or x < 0 or y < 0 or self.chessboard[x][y] != 0:

return 0;

return 1;

def ride(self, x, y, step):

for i in range(8):

xx = x + self.sunx[i]

yy = y + self.suny[i]

if self.check(xx, yy) == 1:

self.chessboard[xx][yy] = step;

if step == self.row*self.column:

self.output();

else:

self.ride(xx, yy, step+1)

self.chessboard[xx][yy] = 0

def output(self):

self.count = self.count + 1

print "count = %d" % self.count

for i in range(self.row):

print self.chessboard[i]

def getcount(self):

return self.count

if __name__ == "__main__":

horseride = horserides(5,4,0,0)

horseride.ride(0, 0, 2)

print "total path: %d" % horseride.getcount()

SDUT 1400 馬的走法 回溯法)

在乙個4 5的棋盤上,馬的初始位置座標 縱 橫 位置由鍵盤輸入,求馬能返回初始位置的所有不同走法的總數 馬走過的位置不能重複,馬走 日 字 如果馬的初始位置座標超過棋盤的邊界,則輸出error。例如初始位置為4 6,則輸出error。輸入資料只有一行,有兩個用空格分開的整數,表示馬所在的初始位置座標...

演算法 馬走日

題目描述 在西洋棋中,馬的走法與中國象棋類似,即俗話說的 馬走日 下圖所示即西洋棋中馬每一步能到達的格仔 箭頭所指為每步到達位置 現有一200 200大小的西洋棋棋盤,棋盤中僅有乙個馬,給定馬的當前位置和目標位置,求出馬最少需要多少跳才能從當前位置到達目標位置。輸入格式 已有檔案txt格式 檔案裡每...

百練 馬走日

總時間限制 記憶體限制 1000ms 1024kb 馬在中國象棋以日字形規則移動。請編寫一段程式,給定n m大小的棋盤,以及馬的初始位置 x,y 要求不能重複經過棋盤上的同乙個點,計算馬可以有多少途徑遍歷棋盤上的所有點。第一行為整數t t 10 表示測試資料組數。每一組測試資料報含一行,為四個整數,...