資料結構與演算法10 馬踏棋盤問題(騎士周遊問題)

2021-06-20 06:38:19 字數 1349 閱讀 1911

問題描述:在乙個西洋棋的棋盤上,乙個馬按照它的規則如何才能從乙個點出發遍歷每乙個位置,且每個點只訪問一次。

問題分析:這是乙個深搜的問題,沿著一條路前進直到遍歷全部的點,那就完成了整個的過程。如果不行,就回退一步,換個方向繼續前進。這可以用遞迴很方便地實現。注意到馬在某個位置最多有8個方向可以走,因此需要對這8個方向進行試探。當然這8個方向不一定都存在,比如在邊緣可能就會少一些。考慮到實際8*8的棋盤計算量比較大,我們使用6*6代替。

#include #define n 6

int chess[n][n];

int next(int* x, int* y, int dir)

break;

case 2:

if (*x+2 < n && *y-1 >= 0 && chess[*x+2][*y-1] == 0)

break;

case 3:

if (*x+2 < n && *y+1 < n && chess[*x+2][*y+1] == 0)

break;

case 4:

if (*x+1 < n && *y+2 < n && chess[*x+1][*y+2] == 0)

break;

case 5:

if (*x-1 >= 0 && *y+2 < n && chess[*x-1][*y+2] == 0)

break;

case 6:

if (*x-2 >= 0 && *y+1 < n && chess[*x-2][*y+1] == 0)

break;

case 7:

if (*x-2 >= 0 && *y-1 >= 0 && chess[*x-2][*y-1] == 0)

break;

case 8:

if (*x-1 >= 0 && *y-2 >= 0 && chess[*x-1][*y-2] == 0)

break;

} return 0;

}int search(int x, int y, int now)

} if (next(&x1, &y1, 2)) }

if (next(&x1, &y1, 3)) }

if (next(&x1, &y1, 4)) }

if (next(&x1, &y1, 5)) }

if (next(&x1, &y1, 6) }

if (next(&x1, &y1, 7)) }

if (next(&x1, &y1, 8)) }

chess[x][y] = 0;

return 0;

}int main()

馬踏棋盤問題(dfs求解)

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

遞迴 回溯 馬踏棋盤問題

將馬隨機放在西洋棋的board 0 n 1 0 n 1 的某個方格中,馬按走棋規則進行移動。走遍棋盤上全部n n個方格。編制遞迴程式,求出馬的行走路線,並按求出的行走路線,將數字1,2,n n依次填入乙個n n的方陣,輸出之。輸入 棋盤的大小n n 10 馬的初始位置 i,j 1 i n,1 j n...

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 一趟走完也...