回溯遍历。骑士巡游(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;
}

你可能感兴趣的:(遍历)