經典回溯問題 騎士遊歷問題

2021-10-24 10:14:26 字數 1116 閱讀 3808

在乙個n*n 格仔的棋盤上,有乙隻西洋棋的騎士在棋盤的左下角,騎士只能根據象棋的規則進行移動,要麼橫向跳動一格縱向跳動兩格,要麼縱向跳動一格橫向跳動兩格。騎士從第乙個格仔出發,每個格仔只能訪問一次,能否訪問完所有的格仔, 請找到乙個解決方案。

這是一道經典的回溯演算法題目,這裡的狀態就是每一步騎士所在的座標位置。

因為騎士可以跳動的位置總共就有8個位置,所以可以提前定義出跳動的距離陣列。每一步只需要將騎士往所有方向上嘗試跳動即可。

/**

* 問題描述:在乙個n*n 格仔的棋盤上,有乙隻西洋棋的騎士在棋盤的左下角,騎士只能根據象棋的規則進行移動,

* 要麼橫向跳動一格縱向跳動兩格,要麼縱向跳動一格橫向跳動兩格。

* 騎士從第乙個格仔出發,每個格仔只能訪問一次,能否訪問完所有的格仔, 請找到乙個解決方案。

*/public

class

knighttour

;private

int ymove=

newint

;public

intsearch

(int n)

private

boolean

backtrace

(int x,

int y)

boolean flag =

false

;for

(int i =

0; i <8;

++i)

} chessboard[x]

[y]=0;

--visitednum;

return flag;

}private

boolean

isvalid

(int x,

int y)

private

void

printsolution()

system.out.

println()

;}}private

void

copysolution()

}}

這裡我遍歷了所有解法,n=6就很難跑出結果了。如果只是判斷是否有解,可以優先選擇下一步可跳路徑少的方向進行剪枝操作,這裡我就不再貼**了。

騎士遊歷問題 至少需要多少步

題目描述 西洋棋的棋盤大家應該都很熟悉了,那麼給定棋盤上的兩個格位,乙個騎士 knight 需要幾步才能從其中乙個格位來到另乙個格位呢?注意騎士沿乙個3 2方格區域的對角線移動。輸入多組測試資料。對於每組資料,包含兩個輸入資料,分別為西洋棋棋盤上兩個格位的位置。輸出對於每組資料,輸出一行it tak...

騎士遊歷問題(馬踏棋盤)解析(c )

解題思路 這是一道經典的遍歷問題 dfs 由於題目要求遍歷全部,那麼肯定要做標記,因此立馬想到dfs深度優先演算法。具體思路如下 了解西洋棋以及西洋棋騎士的走法 西洋棋和中國象棋,大同小異,畢竟中國象棋是老祖先。西洋棋棋子放在格仔中,中國象棋放在點上,且西洋棋有64個格仔。西洋棋的騎士和中國象棋的馬...

回溯經典 n皇后問題

題目大意 八皇后問題是乙個以西洋棋為背景的問題 如何能夠在 8 8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上。八皇后問題可以推廣為更一般的n皇后擺放問題 這時棋盤的大小變為n n,而皇后個數也變成n。當且僅當 ...