演算法描述
乙隻馬在棋盤的某一點,它可以朝8個方向前進,方向向量分別是:(2,1)、(2,-1)、(1,2)、(1,-2)、(-2,1)、(-2,-1)、(-1,2)、(-1,-2),從中任選擇乙個方向前進,到達新的位置。在從新的位置選擇乙個方向前進,繼續,直到無法前進為止。無法前進可能有如下原因:下一位置超出邊界、下一位置已經被訪問過。當馬已經無法前進時,就回退到上一位置,從新選擇乙個新的方向前進;如果還是無法前進,就再回退到上一位置……
從中任選擇乙個方向前進,到達新的位置。在從新的位置選擇乙個方向前進,繼續,直到無法前進為止。無法前進可能有如下原因:下一位置超出邊界、下一位置已經被訪問過。當馬已經無法前進時,就回退到上一位置,從新選擇乙個新的方向前進;如果還是無法前進,就再回退到上一位置……
源程式#include
using namespace std;
class tiaoma
void horse(int x,int y);
void print();
void roud();
};void tiaoma::horse(int x,int y)
if(1<=x-1&&y+2<=n&&map[x-1][y+2]==0)
if(x+1<=n&&y+2<=n&&map[x+1][y+2]==0)
if(x+2<=n&&y+1<=n&&map[x+2][y+1]==0)
if(x+2<=n&&1<=y-1&&map[x+2][y-1]==0)
if(x+1<=n&&1<=y-2&&map[x+1][y-2]==0)
if(1<=x-1&&1<=y-2&&map[x-1][y-2]==0)
if(1<=x-2&&1<=y-1&&map[x-2][y-1]==0)
}void tiaoma::print()
cout<}
}void tiaoma::roud()
else if(map[l][k]==s&&s==count)}}
void main()
執行結果:
1列 2列
3列4列
5列 1行
1 22 17 12 3 2行
16 11 2 7 18 3行
23 24 21 4 13 4行
10 15 6 19 8 5行
25 20 9 14 5
25跳馬路線:
map[1][1]->map[2][3]->map[1][5]->map[3][4]->map[5][5]->map[4][3]->map[2][4]->
map[4][5]->map[5][3]->map[4][1]->map[2][2]->map[1][4]->map[3][5]->map[5][4]->
map[4][2]->map[2][1]->map[1][3]->map[2][5]->map[4][4]->map[5][2]->map[3][3]->
map[1][2]->map[3][1]->map[3][2]->map[5][1]
python 用回溯法求解迷宮問題
今天刷華為機試題,刷到一道迷宮問題,看了其他人提交的 發現有許多小bug不是很滿意,我這裡就用回溯法解決了這個迷宮問題,配上 講解 題目 定義乙個二維陣列n m 其中2 n 10 2 m 10 如5 5陣列下所示 int maze 5 5 它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著...
使用回溯法求解N皇后問題
經典的n皇后問題描述為 在乙個n x n的棋盤上放置n個皇后,要求任意的兩個皇后都不在同一行 同一列或同一條對角線上,問在給定n的情況下有多少種放置的方法。求解n皇后最典型的方法是回溯法,此方法的思路可以概括為 在第一行佔據乙個位置,接著在下一行佔據乙個位置,判斷兩個位置之間是否存在衝突。如果不存在...
用回溯法實現n皇后問題
首先說一下回溯法,如果在到達遞迴邊界前的某層,由於一些事實導致已經不需要任何乙個子問題遞迴,就可以直接返回上一層,這種方法叫做回溯法。include include const int maxn 50 int n,count 0,d maxn hashtable maxn void generate...