相關(guān)鏈接: 江蘇安全網(wǎng) 江蘇質(zhì)量網(wǎng) 江蘇論文網(wǎng) 江蘇資訊網(wǎng)
【摘要】馬步遍歷問題與騎士巡游(knight's tour)問題是指在有8 8方格的國(guó)際象棋棋盤上進(jìn)行奇異的騎士“L型”(L-shaped)移動(dòng)的問題。而騎士巡游問題實(shí)際是帶有約束條件的馬步遍歷問題,因此在用程序求解的時(shí)候可以一并求解。本文給出求解這一問題的回溯算法之C++語(yǔ)言程序。
論文關(guān)鍵詞:騎士巡游,回溯算法,C++語(yǔ)言
一般地說,我們用如下方法表示一個(gè)解:即把數(shù)字0,1,…,63放入棋盤中的方格來表示到達(dá)這些方格的順序。解決騎士巡游問題更具創(chuàng)意的方法之一是由J. C. Warnsdorff在1823年提出的。其規(guī)則是:騎士總是移向具有最少出口且沒有到達(dá)過的方格之一。
由于騎士巡游問題實(shí)際是帶有約束條件的馬步遍歷問題,因此在用程序求解的時(shí)候可以一起求解。程序算法依然是回溯法,和皇后問題有相似之處。馬步遍歷和騎士巡游問題的復(fù)雜度較高,求出一個(gè)解相對(duì)容易,但要求出所有的解是要花一定時(shí)間的。
一、回溯算法的實(shí)現(xiàn)
1.為解決這個(gè)問題,我們把棋盤的橫坐標(biāo)定為i,縱坐標(biāo)定為j。i和j的取值范圍是從1到SIZE。當(dāng)某個(gè)騎士占了位置(i,j)時(shí),其在這個(gè)位置上可以向8個(gè)方向以“L型”移動(dòng),它們分別是:
方向1:i+2,j+1;
方向2:i+1,j+2;
方向3:i-1,j+2;
方向4:i-2,j+1;
方向5:i-2,j-1;
方向6:i-1,j-2;
方向7:i+1,j+2;
方向8:i+2,j-1。
2.棋盤以二維數(shù)組表示,其下標(biāo)最大值8,將騎士的每一步按1,2,3 … 64填入數(shù)組相應(yīng)單元。其過程如下:
………
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
trajKT[i][j]=0;
[作者簡(jiǎn)介] 王力強(qiáng)(1965- ),江蘇省常州市武進(jìn)區(qū)人,陜西省城市經(jīng)濟(jì)學(xué)校財(cái)務(wù)科長(zhǎng),工程師。
………
for(int e=0; e<=curPointSub; e++)
{
trajKT[moveTraj[e].Location.x_pos][moveTraj[e].Location.y_pos] = e+1;
}
for(i=0;i<8;i++)
{
for(int j=0;j<8;j++)
cout<