騎士遊歷問題(馬踏棋盤)解析(c )

2021-09-24 13:37:20 字數 1850 閱讀 4954

解題思路:

這是一道經典的遍歷問題(dfs),由於題目要求遍歷全部,那麼肯定要做標記,因此立馬想到dfs深度優先演算法。具體思路如下:

①了解西洋棋以及西洋棋騎士的走法

西洋棋和中國象棋,大同小異,畢竟中國象棋是老祖先。西洋棋棋子放在格仔中,中國象棋放在點上,且西洋棋有64個格仔。西洋棋的騎士和中國象棋的馬功能相當,都可以走八個方位。走法是走「日」字,或英文本母大寫的「l」形:即先向左(或右)走1格,再向上(或下)走2格;或先向左(或右)走2格,再向上(或下)走1格。與中國象棋的馬不同,西洋棋的馬可以跳過路上的其他棋子,不受拐腳的限制。

解題需要我們可以把格仔抽象成乙個點,那麼西洋棋的騎士走法就是乙個日字。

②設定標記

初始化陣列,讓每個元素初始化為0,並且初始化乙個記錄騎士遍歷次數的cal也為0

int cal =0;

//統計走的順序

//初始化為0

int chress[8]

[8]=

;

③判斷是否超界和是否被訪問
bool ifout

(int x,

int y)

//判斷是否出界

bool ifvisited

(int x,

int y)

//判斷是否被訪問

④遞迴主體
void

dfs(

int x,

int y)

else

//else其中包括已經被訪問了,和沒有被訪問且在界外的

return

;}

⑤總**如下(編譯器vs2013)
#include

"stdafx.h"

#include

#include

using namespace std;

int cal =0;

//統計走的順序

//棋盤初始化為0做標記

int chress[8]

[8]=

;bool ifout

(int x,

int y)

//判斷是否出界

bool ifvisited

(int x,

int y)

//判斷是否已經被訪問

void

dfs(

int x,

int y)

else

//出界了則退出return

return;}

intmain()

dfs(x,y)

;for

(int i =

0; i <

8; i++

)//輸出列印測試

return0;

}

⑥測試截圖:

15騎士周遊問題(馬踏棋盤問題)

輸出5 5棋盤的騎士周遊的方法數 include include define x 5 define y 5 int chess x y 二維陣列的初始化,兩個大括號 int count 0 void print printf n 這裡的 n放置也非常巧妙,一行之後換行 printf n 一趟走完也...

馬踏棋盤問題(dfs求解)

問題描述 8 8的棋盤,剛開始讓馬在棋盤的任意乙個位置上,讓馬踏日,有八個方向 判斷沒踏過並且可踏,就踏,直到踏完所有的格仔 cnt 64 呼叫printchess函式。在外層另外加上兩層,確保 8 8 方格中的每乙個格仔都有8中不同的選擇 重點 為了確保每個格仔能走日字,而且選擇的可能性等同,初始...

貪心演算法 馬踏棋盤(C)

貪心演算法 又稱貪婪演算法 是指,在對 問題求解 時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的僅是在某種意義上的區域性 最優解。貪心演算法不是對所有問題都能得到整體 最優解,但對範圍相當廣泛的許多問題他能產生整體最優解或者是整體最優解的近似解。貪婪演算法是一種改進...