假設西洋棋棋盤有5*5共25個格仔。設計乙個程式,使棋子從初始位置(如圖)開始跳馬,需要將棋盤的格仔全部都走一遍,每個格仔只允許走一次。
p.s西洋棋的棋子是在格仔中間的。西洋棋中的「馬走日」,如第一步為[1,1],第二步為[2,8]或[2,12],第三步可以是[3,5]或[3,21]等,以此類推。
#include using namespace std;
const int m = 5, n = 5;
int countn = 0;
int trace[m][n] = ;
int changedir[2] = ,,,,,,, };
void printt()
cout << endl;
} cout << "------------" << endl;
}void visit(int x, int y, int step)
int nextx, nexty;
for (int i = 0; i < 8; i++)
visit(nextx, nexty, step + 1);
trace[nextx][nexty] = 0; }}
void main()
思考:此題也是遞迴回溯的思想。當確定乙個位置之後,要考慮8種可以跳馬的方向,設定乙個記步數的變數step,當step為25時退出遞迴,同時把最後確定的乙個位置,即寫著25的格仔的變數重置為0,同時退回到第24步,去尋找其它第25步的可能位置。
結果:
馬走日的解法(dfs)
馬在中國象棋以日字形規則移動。請編寫一段程式,給定n m大小的棋盤,以及馬的初始位置 x,y 要求不能重複經過棋盤上的同乙個點,計算馬可以有多少途徑遍歷棋盤上的所有點。input 第一行為整數t t 10 表示測試資料組數。每一組測試資料報含一行,為四個整數,分別為棋盤的大小以及初始位置座標n,m,...
資料結構的非經典解法
把要維護的序列分成 n 塊,每塊長度 n 最後一塊的長度為n n 2 對於單次區間操作 被該區間包含的整塊打上標記,左端和右端剩餘部分 小於2n 個 直接暴力操作,複雜度為o n 分塊 2.莫隊 離線 對於一系列區間操作 假設我們在已知區間 l r 的答案,在o f n 的時間複雜度內能夠得到 l ...
資料結構課程設計 馬的遍歷
設計程式完成如下要求 在中國象棋盤上,對任意位置上放置乙個馬,均能選擇乙個合適的路線,使得該棋子能夠按照象棋的規則不重複的走過棋盤上的每一位置。要求 1 依次輸出走過的各位置的座標 2 最好能畫出棋盤的圖形形式,並在其上動態的標註行走過程 思路 最開始用的是dfs,但是遞迴層數多的時候就無法在短時間...