在乙個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。當且僅當 ...