馬周遊問題

2021-07-02 06:59:08 字數 1764 閱讀 3530

在2023年的阿里巴巴筆試中遇到過馬周遊問題,做一下相關學習筆記以備以後檢視。

馬周遊題目如下:

馬周遊(馬跳日)問題:在乙個 8*8 的棋盤上(如下圖)一匹馬從任意位置開始,恰好走過棋盤中的每一格(每個格仔有且只能走一次),並且最後還可以回到起點位置。

這個問題其實可以進行推廣:即棋盤大小不一定是 8*8 ,只要棋盤大小 m * n 滿足:

① m >=6 ;n>= 6;② m n都是偶數 ;③ | m-n | <=2

當然這個問題還可以縮小:即馬周遊最後不一定要回到原點,只要遍歷走完棋盤中的所有格仔即可。

顯然常規的解法就是採用回溯法,並且要在回溯過程中進行剪枝。

馬周遊最簡單的一種:即馬周遊只需要遍歷走完棋盤中的所有格仔即可,不要求最後要回到起點位置。  

解法說明:其實很容易理解到,馬周遊棋盤,也就是要遍歷棋盤中的所有格仔有且只能一次,那麼很顯然就是乙個圖的遍歷問題了。上面的筆試題目就是這種問題。

回溯法**如下:

#include #include#define n 8

#define nn 64

int main() ;

int c_inc[n] = ;

int board[n][n],step[nn],row[nn],col[nn];

int m,n,r,c,r0,c0,k,results=0;

m=n=5;

for(int i=0;i=0)

這段**中的m,n是可以自己設定的方陣大小,執行以後發現最小的能完成乙個騎士征程的方陣n=5,m=n=5時有1728中解法,m=n=6時大約有1000w中解法。當m=n=7的時候這段**執行時間很長才能出來結果。可以看出當邊數增大的時候效率並不是很高。

#include #include#define n 8

#define m 8

#define door 4

#define mn 64

#define mn2 32

int main() ;

int c_inc[n] = ;

int board[m][n],step[mn],row[mn],col[mn];

int r,c,r0,c0,k,results=0;

// m=n=8;

for(int i=0;i=0);

int c_inc[n] = ;

bool find(int x,int y,int a,int b)

int main() {

int board[n][n],step[nn],row[nn],col[nn];

int m,n,r,c,r0,c0,k,results=0;

// printf("enter board lenth and width:\n");

// scanf("%d,%d\n",&m,&n);

// printf("\n enter the start point(r0 and c0):\n");

// scanf("%d,%d",&r0,&c0);

m=n=7;

for(int i=0;i=0){

if((k==m*n-1)&&find(row[k],col[k],r0,c0)){

printf("\n[%d]\n",++results);

for(int i=0;i

sicily 1153 馬的周遊問題

time limit 1 secs,memory limit 32 mb special judge 和題目c同樣的任務,這裡只是把棋盤擴大到標準的西洋棋。對這樣乙個8 8的棋盤用同樣的方法編號如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20...

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

馬的Hamilton周遊路線

8 8的西洋棋棋盤上的乙隻馬,恰好走過除起點外的其他63個位置各一次,最後回到起點,這條路線稱為馬的一條hamilton周遊路線。對於給定的m n的西洋棋棋盤,m和n均為大於5的偶數,且 m n 2,試設計乙個分治演算法找出馬的一條hamilton周遊路線。include include defin...