记得上学期我也搞了一点遍历的,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;
}