10馬踏棋盤之中國象棋

2021-07-26 22:50:48 字數 1587 閱讀 4510

題目:在半個中國象棋棋盤上,馬在左下角(1,1)處,馬走日字,而且只能往右走,不能向左,可以上下,求起點到(m,n)處有幾種不同的走法。

基本思想:遞迴回溯探索演算法

測試資料:

9 5 37

8 4 20

3 2 1

4 4 2

/*

題目:在半個中國象棋棋盤上,馬在左下角(1,1)處,馬走日字,而且只能往右走,不能向左,可以上下,求起點到(m,n)處有幾種不同的走法。

基本思想:遞迴回溯探索演算法

演算法:1。儲存棋盤(二維陣列)

2。測試資料:

9 5 37

8 4 20

3 2 1

4 4 2

*****

總之對應的規則是:陣列橫座標對應數學橫座標,陣列縱座標對應數學縱座標;

關鍵記憶點就是乙個二維陣列的第一引數是縱座標,第二引數是橫座標,起點在左上方0.0

*****

*/#include

#include

#define x 5

#define y 9

int chess[x][y]=};//二維陣列的初始化,兩個大括號

int count=0;

void print()

printf("\n");//這裡的\n放置也非常巧妙,一行之後換行

}printf("\n");//一趟走完也換一次行,親測這個沒必要換行,因為visit中已經有換行;用了也沒事,就多乙個換行而已

}void visit(int x,int y,int tag,int x1,int y1)

/*1、要非常小心這裡的二維陣列的橫縱座標和數學中的橫縱座標的理解:

陣列的橫座標,即x,表示的是矩陣的行數,陣列的縱座標,即y,表示的是矩陣的列數;非常非常容易混淆;因為

數學中的橫座標,小x是表示矩陣的列數;數學中的縱座標,即小y,表示的是矩陣的行數,剛剛好相反;

2、還是橫縱座標的問題,這裡的陣列象限判斷出錯了,i正負,表示上下移動,即行方向移動,不要和數學中的混淆;

j正負,表示左右移動,即列方向移動

*///第一象限進一右二

if(i+1

21][j+2]==0)

//第一象限進二右一

if(i+2

12][j+1]==0)

第四象限退一右二

if(i-1>=0&&j+2

1][j+2]==0)

//第四象限退二右一

if(i-2>=0&&j+1

2][j+1]==0)

/*這一步重置標記位置為0,也是相當重要,作用是讓給下一種走法;

這個chess放在這裡很巧妙,可能有點難理解:chess是放在所有八個遞迴函式的最後,也就是說,第一次

執行這個chess是第乙個tag=x*y,比如5*5就是25;然後從25開始,依次回退,

這裡還有乙個難點,就是這裡是回溯法,所以更準確的說不是,從25開始依次回退到1;而是從25回退,讓後再檢測其他相鄰結點;

有點像深度優先查詢;

*/chess[i][j]=0;

}int main()

深度優先搜尋之中國象棋

題目描述 中國象棋博大精深,其中馬的規則最為複雜,也是最難操控的一顆棋子。我們都知道象棋中馬走 日 比如在 2,4 2,4 位置的乙個馬,跳一步能到達的位置有 0,3 0,3 0,5 0,5 1,2 1,2 1,6 1,6 3,2 3,2 3,6 3,6 4,3 4,3 4,5 4,5 蒜頭君正在和...

Mathmatic繪製簡易中國象棋棋盤

用mathmatic命令繪製簡易的中國象棋棋盤 中國象棋棋盤的基本格局如圖所示 有10行9列,以左下方 車 所在的地方設為座標原點 先繪製10條橫線.hx table line 豎線 sx1 table line sx2 table line sx3 line sx4 line 叉 cha1 lin...

程式設計之美之中國象棋問題

一 題目原型 下過中國象棋的朋友都知道,雙方的 將 和 帥 相隔遙遠,並且它們不能照面。在象棋殘局中,許多高手能利用這一規則走出精妙的殺招。假設棋盤上只有 將 和 帥 二子 如圖 1 3所示 為了下面敘述方便,我們約定用a表示 將 b表示 帥 那麼a和b的運動將被限制在己方的3x3的格仔中,a b可...