馬的遍歷問題 回溯法應用 ACM

2022-01-22 06:20:42 字數 1633 閱讀 6283

馬的遍歷問題

在n*m

的棋盤中,馬只能走「日」 字。馬從位置

(x,y

)處出發,把棋盤的每一格都走一次,且只走一次。找出所有路徑。

問題解的搜尋空間?

棋盤的規模是

n*m,是指行有

n條邊,列有

m條邊。

馬在棋盤的點上走,所以搜尋空間是整個棋盤上的

n*m個點。

用n*m

的二維陣列記錄馬行走的過程,初值為

0表示未經過。

在尋找路徑過程中,活結點的擴充套件規則?

對於棋盤上任意一點

a(x,y

),有八個擴充套件方向:

a(x+1,y+2),a(x+2,y+1)

a(x+2,y-1),a(x+1,y-2)

a(x-1,y-2),a(x-2,y-1)

a(x-2,y+1),a(x-1,y+2)

為構造迴圈體,用陣列

fx[8]=,

fy[8]=

來模擬馬走「日」時下標的變化過程。

擴充套件的約束條件

不出邊界

;每個點只經過一次。

棋盤點對應的陣列元素初值為

0,對走過的棋盤點的值置為

所走步數

,起點儲存「

1」,終點儲存「

n*m」。函式

check

,檢查當前狀態是否合理

輸入

0 0
輸出

1  90 82 75 88 83 78 85 89

71 74 2 64 81 76 87 84 79

44 55 72 69 3 63 80 77 86

73 70 45 56 65 68 4 62 59

54 43 66 51 46 57 60 49 5

41 37 53 31 67 50 47 58 61

35 12 42 38 52 30 25 6 48

20 39 36 13 32 23 16 29 26

11 34 21 18 9 14 27 24 7

40 19 10 33 22 17 8 15 28

#include #include int matrix[10][9];

int journey = 1;

int step_x=,step_y=;

void outmatrix()

printf("\n"); }}

bool outofbounds(int x,int y)

bool iscome(int x,int y)

void gotoend(int x, int y ) }}

int main()

gotoend(start_x,start_y);

outmatrix();

return 0;

}

馬踏棋盤(關於回溯法的應用)

問題描述 在中國象棋中,棋子馬的走法是走 日 字型 現有一8 8的中國象棋棋盤,棋子馬從任意給定一點出發,走 日 字型,要求為馬 尋找一條走遍棋盤每一格並且只經過一次的一條路徑。給定乙個初始的座標,如 0,0 從該點向外走 日 字型,有兩種走法,若起始點 在 4,4 棋子的每個方向都可以走,有八種走...

回溯法解決馬步遍歷問題

設計一演算法,求解西洋棋中的馬的周遊問題 給定一8 8的棋盤,馬從棋盤的某個位置出發,經過棋盤中的每乙個方格恰好一次。只需求一可行解 一 演算法思想描述 指定乙個起點座標,從起點開始對每個點遍歷其能到達的八方向上的點,如果可以踩則走到該結點上,並繼續深入遍歷,直到最後走完所有的結點。二 完整的程式以...

馬的遍歷 搜尋與回溯

題目描述description 中國象棋半張棋盤如圖所示。馬自左下角往右上角跳。今規定只許往右跳,不許往左跳。比如圖4 a 中所示為一種跳行路線,並將所經路線列印出來。輸入輸出格式input output 輸入格式 無輸出格式 第一行 乙個整數total表示第幾種跳法 第二行 0,0 2,1 3,3...