用回溯法求解跳馬問題

2021-06-15 22:26:19 字數 1590 閱讀 9876

演算法描述

乙隻馬在棋盤的某一點,它可以朝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...