(一)馬踏棋盤經典演算法描述:
(1)馬踏棋盤是經典的程式設計問題之一,主要的解決方案有兩種:一種是基於深度優先搜尋的方法,另一種是基於貪婪演算法的方法。第一種基於深度優先搜尋的方法是比較常用的演算法,深度優先搜尋演算法也是資料結構中的經典演算法之一,主要是採用遞迴的思想,一級一級的尋找,遍歷出所有的結果,最後找到合適的解。而基於貪婪的演算法則是制定貪心準則,一旦設定不能修改,他只關心區域性最優解,但不一定能得到最優解。
【問題描述】關於馬踏棋盤的基本過程:西洋棋的棋盤為 8*8 的方格棋盤。現將"馬"放在任意指定的方格中,按照"馬"走棋的規則將"馬"進行移動。要求每個方格只能進入一次,最終使得"馬"走遍棋盤的64個方格。
【演算法分析】
① 在四角,馬踏日走只有兩個選擇;
② 在其餘部分,馬踏日走有
四、六、八不等的選擇。
解決方案:
在外層另外加上兩層,確保 8*8 方格中的每乙個格仔都有8中不同的選擇;
重點:為了確保每個格仔能走日字,而且選擇的可能性等同,初始化除了最外兩層格仔標記沒有被訪問,最外兩層中每個格仔都標記為已被訪問即可達到目標!
解釋:中標記紅色的區域,初始化時就預設為馬已踏日字,集已被訪問,而中間的 8*8 的**標記為馬未被訪問!
並且每乙個**中馬在訪問時都有8中不同的選擇,這8中不同的選擇都會在其相應的x和y座標上進行追加標記;
這8中選擇方式為:
【**展示1】:遞迴求解(回溯法求解),列出所有的解,並從中找出從(2,2)位置出發的合適解:
#include #include using namespace std;
int chessboard[12][12] = ;
int cnt = 0; //標記馬已走的方格數
int sum = 0; //標記馬走完全程的具體方案數
int move[8][2]=,,,,,,,}; //初始馬當前位置向其周圍相鄰八個日字的 x,y的偏移量
//輸出馬踏棋盤的解
void printchess();
//馬踏棋盤遞迴過程
void horse(int x,int y);
int main(void)
} }//從起始位置開始求得所有解
chessboard[2][2] = ++cnt;
horse(2,2); //遞迴呼叫當前當前位置附近的 8 個日字,看看是否滿足條件
return 0;
} void horse(int x,int y)
for(int i=0;i<8;i++) }}
//輸出馬踏棋盤的解
void printchess(); //申請乙個棧空間(裡面儲存的就是 x,y,i三個具體的變數值),來標記馬走的具體位置
int chessboard[12][12] = ; //記錄 8 * 8棋盤馬走的具體腳印
int cnt = 1; //標記馬已走的方格數
int move[8][2]=,,,,,,,}; //初始馬當前位置向其周圍相鄰八個日字的 x,y的偏移量
//輸出馬踏棋盤的解
void printchess();
//馬踏棋盤遞迴過程
void horse(int x,int y);
int main(void)
} }horse(2,2); //從 (2,2)的位置開始跑,求得馬踏棋盤的一組解
printchess();
return 0;
} //非遞迴求一組解的過程
void horse(int x,int y)
} if(i<8){ //能夠訪問當前馬位置附近的日字
chessboard[a][b]=++cnt;
stackhorse[top][2]=i; //記錄訪問當前馬位置附近的日字序號(0【問題的解】:列出一組解:
馬踏棋盤python 馬踏棋盤python實現
import collections import random class checkerboard object 初始化棋盤 def init self,len self.len len self.position has gone set def init checkerboard self ...
回溯演算法(馬踏棋盤)
近期學習了回溯演算法於是自己寫了馬踏棋盤的遞迴以及非遞迴方式的 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...