記得上學期我也搞了一點遍歷的,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;
}