天天看點

騎士巡遊問題matlab,【編寫程式求解騎士巡遊問題:在n行n列的棋盤上(如n=5),假設一位騎士(按象棋中“馬走日”的行走法)從初始坐标位置(x1,y1)出發,要遍訪(巡遊)棋盤中的每一個位置一次。...

編寫程式求解騎士巡遊問題:在n行n列的棋盤上(如n=5),假設一位騎士(按象棋中“馬走日”的行走法)從初始坐标位置(x1,y1)出發,要遍訪(巡遊)棋盤中的每一個位置一次。請編一個程式,為騎士求解巡遊“路線圖”(或告訴騎士,從某位置出發時,無法遍訪整個棋盤 — 問題無解)。

當n=5時,意味着要在5行5列的棋盤的25個“點”處,按騎士行走規則,依次将1至25這25個“棋子”(數位)分别擺放到棋盤上(擺滿25個位置則成功,否則失敗問題無解)。

例如,當n=5且初始坐标位置定為(1,1) — 即最左上角的那個點時,如下是一種巡遊“路線圖”。程式執行後的輸出結果為:

(x1,y1)? => (1=>5, 1=>5) : 1 1

1 6 15 10 21

14 9 20 5 16

19 2 7 22 11

8 13 24 17 4

25 18 3 12 23

提示:

(1)“棋盤”可用二維數組B表示。

(2)編制一個具有如下原型的遞歸函數solve,用于完成任務:從(i,j)點出發,做第k至第n*n(即n的平方)次的移動 — 将k直到n的平方這些數位按規則分别擺放到棋盤即數組B中,若成功則通過引用參數ok傳回true,否則傳回false。

void solve(int i, int j, int k, bool& ok);

(3)編制主函數,讓使用者輸入作為巡遊起點的初始坐标位置(x1,y1),在該處擺放“棋子”(數位)1,而後進行調用“solve(x1, y1, 2, ok);”來完成所求任務。

欲處理的初始問題為:從某點(x1,y1)出發,按所給行走規則,作24次移動,遍訪棋盤中沒被通路過的各點(或發現無路可走)。

可分解化簡為如下兩個子問題(正是形成遞歸函數的基礎):

① 由點(x1,y1)出發,按所給行走規則作1次移動到達(g,h)(或發現無路可走);

② 從(g,h)點出發,按所給行走規則,作23次移動,遍訪棋盤中沒被通路過的各點(或發現無路可走)。

solve函數具體實作時,若由(i,j)點出發已“無路可走”,則将引用參數ok置為false而遞歸出口;否則,先“邁一步”到達(g,h)點,而後再進行遞歸調用:solve(g, h, k+1, ok);以實作從新點(g,h)出發,将k+1直到25這些“棋子”(數位)分别擺放到棋盤上,若成功則通過引用參數ok傳回true(否則傳回false)。

點評:

(1)也可編制第二種解法的主函數:将棋盤上的n平方個點依次作為巡遊起點的初始坐标位置(x1,y1),判斷從每一位置出發是否有解或無解(輸出“OK!”或“NO!”,但并不輸出“路線圖”)。

(2)若更改程式中的n值(如改為4或6等),便可求解其他階數的巡遊“路線圖”。

(3)可改用非遞歸方法設計并編寫solve函數,那樣的話,通常要增加一個記錄擺放“棋子”資訊的數組,可記錄下是沿着什麼方向到達了目前的什麼位置(在那兒擺放了“棋子”)等,而且對上述數組可按照棧(stack)的方式來使用(棧總是采用FILO即所謂的先進後出使用方式),以便在“無路可走”的情況下,回退(回溯)到上一個位置,接着按照另外的方向去尋找其他的“行走”方法。

網上有很多,但跟題目要求不符,請高手用C++編一下,複制的别來

作業幫使用者2017-06-24舉報

騎士巡遊問題matlab,【編寫程式求解騎士巡遊問題:在n行n列的棋盤上(如n=5),假設一位騎士(按象棋中“馬走日”的行走法)從初始坐标位置(x1,y1)出發,要遍訪(巡遊)棋盤中的每一個位置一次。...