騎士巡遊問題C報告

2021-09-20 05:08:45 字數 2640 閱讀 2370

軟體課程設計1報告

姓名: 學號:

姓名學號

專業電腦科學與技術

設計題目寫程式求解騎士巡遊問題

指導教師

2010 年 07 月 01 日

中國礦業大學徐海學院課程設計綜合成績表

目錄《constructing roads》解題與演算法分析報告

一、題目描述 5

二、解題思路 8

三、相關演算法介紹 8

四、主要資料結構 8

五、流程圖 9

六、源程式 11

七、時空分析 13

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

輸入輸入n行n列的棋盤的大小(1 <= n <= 12),建立乙個n*n的陣列,陣列[i][j]棋盤,再輸入騎士巡遊的初始位置(i,j)。

輸出例如,當n=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)。

遞迴演算法:在函式或子過程的內部,直接或者間接地呼叫自己的演算法。

回溯演算法:問題的每個解都包含n部分,先給出第一部分,再給出第二部分,……直到給出第n部分,這樣就得到了乙個解。若嘗試到某一步時發現已經無法繼續,就返回到前一步,修改已經求出的上一部分,然後再繼續向後求解。

這樣,直到回溯到第一步,並且已經將第一步的所有可能情況都嘗試過之後,即可得出問題的全部解。

全域性性的二維陣列b[ ][ ] ,a[ ][ ]

一維陣列dx[ ], dy[ ]

main()流程

a[i][j]=true

solve()流程

#include

#include //i/o流控制標頭檔案,setw()的標頭檔案,setw(n) 設域寬為n個字元 #define n 12定義乙個巨集並賦初值

using namespace std;

int b[n][n]; //定義全域性性的二維陣列儲存步數

bool a[n][n]; //記錄某一點是否已經走過

int num=0; //記錄方案數

int dx=;

int dy=; //提供每一步的走法

void solve(int i,int j,int k,bool&ok,int n) //計算走法

else

a[x1][y1]=true;

}} }int main()

cout<<"請輸入起始位置的座標:";

cin>>row>>col;

b[row-1][col-1]=1設定起始點

a[row-1][col-1]=false;

solve (row-1,col-1,2,ok,n); //呼叫函式計算結果

if(!ok)

cout<<"從點("< return 0;

}時間複雜度:

(1)時間頻度

乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多。

乙個演算法中的語句執行次數稱為語句頻度或時間頻度。記為t(n)。

(2)時間複雜度

本題的時間複雜度為o()。

空間複雜度:

本題的空間複雜度為o(n*n)。

C面試問題

c語言面試題大彙總之華為面試題 1 區域性變數能否和全域性變數重名?答 能,區域性會遮蔽全域性。要用全域性變數,需要使用 區域性變數可以與全域性變數同名,在函式內引用這個變數時,會用到同名的區域性變數,而不會用到全域性變數。對於有些編譯器而言,在同乙個函式內可以定義多個同名的區域性變數,比如在兩個迴...

C理論知識問題

再給這個數先左移2次 原來數的4倍,然後,在給這個數字乘以2 原來數的8倍,最後加上存放在暫存器裡面的兩倍就 原來數字的10倍了。這些都是由cpu的指令系統控制的,在做邏輯運算的時候 就是邏輯控制單元 在起作用了,其實就是一些奇怪的加法比如 與運算就會被規定兩個不一樣的數字進行比較結果為0 或運算 ...

C 實習報告

實驗報告 課程名稱 c 程式設計 專業班級電子1041 姓名李巨集平 學號 1004451132 電氣與資訊學院 和諧勤奮求是創新 實驗教學考核和成績評定辦法 1 課內實驗考核成績,嚴格按照該課程教學大綱中明確規定的比重執行。實驗成績不合格者,不能參加課程考試,待補做合格後方能參加考試。2 單獨設立...