完整clion下工程,見:
馬踏棋盤問題即在乙個8*8的棋盤上,指定乙個起點,找到乙個路徑,讓棋子按照馬走日的規則將所有格仔無重複的遍歷一次。
這個問題是在學習資料結構與演算法的時候看到的,當時看的是c語言的版本,也沒記住具體的解法,事後回顧起來覺得很有意思,於是自己用c++編寫了一段**嘗試一下。
首先進行分析:從資料結構的角度來分析,乙個棋盤可以看作乙個二維陣列。然後是對每次落子進行分析,根據馬走日的規則,假設不考慮是否會出現越界情況,則在某位置x上,下一步落子共有八種可能性,如圖所示,按照順時針順序依次標記為0,1,2,3,4,5,6,7:-7
-0-6
---1
--x-
-5--
-2-4
-3-
那麼顯然易見,已知x的情況下,利用深度優先遍歷的方式,是一定可以得到乙個路徑滿足要求的,只不過這麼做的計算複雜度非常之高。有了想法,當然是以能跑出結果為導向先寫出大概的**才行,於是我按照這個思路寫出了原始版本:
/*
* 馬踏棋盤最原始的深度優先演算法
* 利用棧
*/#include
#include
#include
#include
#include
using namespace std; const int chessx = 8; const int chessy = 8; static bool chess[chessx][chessy];//棋盤,遍歷過的位置進行標記 struct id; ~id() = default; }; stack
step;//棧,依次存放每次遍歷的座標,回溯的時候出棧 bool run(int,int); int judge(int,int,int &);//判斷路徑,返回0-7表示選擇的路徑,返回則需要回溯 bool isinchess(int,int,int);//判斷某個方向的落子是否在棋盤內 bool isneverrun(int,int,int);//判斷落子是否被遍歷過 id next(int,int,int);//返回cnt方向的落子位置 int main() //finish==false step.pop(); chess[x][y] = false; return false; } int judge(int x,int y,int &cnt) return cnt; } bool isinchess(int x,int y,int cnt) ; int cnt = 0;//表示深度,表示走的步數 int fx[8] = ; int fy[8] = ; typedef int direct;//定義新的資料型別,方便表示,0-8表示8個落子方向 typedef multimap
nextmap;//存放每個位置下乙個落子優先順序的資料 typedef nextmap::iterator niter;//定義迭代器型別 bool run(int,int);//遞迴主函式 nextmap judge(int,int,int&,int&);//返回下乙個落子位置的優先順序,並且在keyvmin裡存放key值的非0最小值 bool isok(int,int,direct);//判斷座標是否可用:1.沒遍歷過2.沒有超出棋盤 int main() } } chess[x][y] = 0; --cnt; return false; } nextmap judge(int x, int y,int &keymin,int &keymax) res.insert(make_pair(cnt,i)); if(keymin>cnt) keymin = cnt; if(keymax
效果還是很明顯的,而且全部**採取c++11進行編寫。不過,應該還是可以繼續優化的,只不過目前才疏學淺,就到此為止吧。
馬踏棋盤及其優化
在8 8的西洋棋棋盤中的任何乙個位置,放置乙個馬 棋子 使其按照馬在西洋棋中的規則 走日 進行移動,求其中的乙個解。這其實是乙個深度優先搜尋的問題,深度優先搜尋一般使用遞迴實現,在這裡,為了學習,使用我們更不熟悉的棧來操作。1.給定乙個起點,將起點入棧,步數step 1。2.在map陣列中的該位置的...
回溯演算法(馬踏棋盤)
近期學習了回溯演算法於是自己寫了馬踏棋盤的遞迴以及非遞迴方式的 theme 馬踏棋盤 回溯演算法 coder 秒針的聲音 time 2015.1.11 include include include define m 8 typedef struct nodehorse horse horse1 i...
馬踏棋盤演算法
為.c檔案 include include include define rows 8 define cols 8 int cheesboard rows cols const int movex 8 const int movey 8 初始化棋盤,將棋盤所有的位置賦值為0 void initboa...