回溯遍歷。騎士巡游(knight)


    記得上學期我也搞了一點遍歷的,BFS,DFS還有回溯遍歷,但當時搞得不是很深入。再次拾起,感覺很熟悉,嘿嘿,不錯不錯。

    回溯搜索的遞歸實現如下:

  void trace( int  depth,….)

  {   int i;

     if (depth>目標深度)

     {  輸出方案;return;}

     for (i=depth深度可能決策范圍)

         if( 決策i符合展開條件)

         {  記錄決策i;

              try(depth+1);

              刪除決策i;

       }

}

    騎士巡游
問題描述
     在 n × n 方格的國際象棋棋盤上,馬(也稱為騎士Knight)從任意指定的方格出發,以跳馬規則(橫一步豎兩步或橫兩步豎一步),周游棋盤的每一個格子,要求每個格子只能跳過一次。有規則 不越界 未到過
 
 
#include <iostream>
#include <cstdio>
#include <fstream>

#define MAX 10
int n,i,j,x,y,total=0;
int board[MAX][MAX];
int dx[8]={1,-1,-2,-2,-1,1,2,2};
int dy[8]={2,2,1,-1,-2,-2,-1,1};

using namespace std;

void Display(){
for(i=0 ;i<n ;i++){
for(j=0 ;j<n ;j++)
if(board[i][j]==0)
printf("%3d",n*n);
else
printf("%3d",board[i][j]);
printf("\n");
}
printf("\n");
}

void Trace(int step,int x,int y){
int i;
total++;
if(n*n==step){
Display();
return;
}
for(i=0 ;i<8 ;i++)
if(x+dx[i]>=0 && x+dx[i]<n &&
y+dy[i]>=0 && y+dy[i]<n && board[x+dx[i]][y+dy[i]]==0){
board[x+dx[i]][y+dy[i]]=step+1;
Trace(step+1,x+dx[i],y+dy[i]);
board[x+dx[i]][y+dy[i]]=0;
}
}
int main()
{
freopen("acm.txt","r",stdin);
scanf("%d",&n);
for(i=0 ;i<n ;i++)
for(j=0 ;j<n ;j++){
board[i][j]=0;
}
scanf("%d%d",&x,&y);
board[x][y]=1;
Trace(1,x,y);
return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM