問題描述:在乙個西洋棋的棋盤上,乙個馬按照它的規則如何才能從乙個點出發遍歷每乙個位置,且每個點只訪問一次。
問題分析:這是乙個深搜的問題,沿著一條路前進直到遍歷全部的點,那就完成了整個的過程。如果不行,就回退一步,換個方向繼續前進。這可以用遞迴很方便地實現。注意到馬在某個位置最多有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 一趟走完也...