1. 程式人生 > >圖的遍歷演算法-馬遍歷棋盤

圖的遍歷演算法-馬遍歷棋盤

題目

在n*m的棋盤中,馬只能走日子,馬從位置(x,y)處出發,把棋盤的每一點都走一次,且只走一次,找出所有的路徑。

demo實現

棋盤設定為5*4,初始位置設定為(0.0)

演算法重點

回溯

在遞迴後方將座標置為初始狀態0。
當路徑錯誤的時候,能夠把路徑恢復到走之前的狀態。

具體的實現,在註釋中已經寫得比較清楚。

#include<iostream>

using namespace std;

//座標固定的馬有八種走的方式
//用陣列進行儲存,方便在for中使用
int fx[8]= {1,2,2,1,-1,-2,-2,-1};
int fy[8]= {2,1
,-1,-2,-2,-1,1,2}; static int mCount; const static int n=5,m=4; int a[n][m]; //用int二維陣列來表示走的路勁 void mFind(int x,int y,int dep);//尋找路徑的遞迴 int mCheck(int x,int y);//判斷座標是否出界,是否已經走過 void output();//列印路徑 int main() { int x=0,y=0;//選擇(0,0)為初始點 mCount=0; for(int i=0; i<n; i++) for(int j=0; j<m; j++) a[i][j]=0
; a[x][y]=1; mFind(x,y,2); if(mCount==0) cout<<"Non solution"<<endl; else cout<<endl<<"final count = "<<mCount<<endl; } void mFind(int x,int y,int dep) { int xx,yy; for(int i=0; i<8; i++) { xx=x+fx[i]; yy=y+fy[i]; if
(mCheck(xx,yy)==1) { a[xx][yy]=dep; if(dep==n*m) output(); //如果深度為n*m,那麼表示遍歷結束,就列印 else mFind(xx,yy,dep+1); a[xx][yy]=0; //回溯,恢復未走座標。(如果走錯,要將走錯的路徑還原) } } } int mCheck(int x,int y) { //判斷座標是否出界,是否已經走過 if(x<0||y<0||x>=n||y>=m||a[x][y]!=0) return 0; return 1; } void output() { mCount++; cout<<endl; cout<<"count= "<<mCount; for(int i=0; i<n; i++) { cout<<endl; for(int j=0; j<m; j++) cout<<a[i][j]<<" "; } }