第一种方法,深度搜索的递归方法
/*
CODE BY 我的BLOG AT 2004.10.13
独立钻石棋问题
深度搜索,递归调用法
*/
#include<iostream>
#include<fstream>
using namespace std;
#define IN 1 // 有棋子
#define NOTIN 0 // 没有棋子
#define NEVERIN 2 // 不可到达位置
#define MAXN 7 // 棋盘大小
#define STEP 31 // 31步结束
int c[MAXN+1][MAXN+1]; // 存储空间
int pass[4][2]={
{0,-1},{-1,0},{0,1},{1,0}}; // 四个方向跳过位置
int reach[4][2]={
{0,-2},{-2,0},{0,2},{2,0}};// 四个方向到达位置
bool findit = false; // 记录是否找到结果
// 输出一个棋局
void output(int c[][MAXN+1]);
// 递归搜索解
void Search(int depth);
int main(void)
{
ifstream cin("cin.txt");
// 输入
for(int i=1;i<=MAXN;i++){
for(int j=1;j<=MAXN;j++){
cin>>c[i][j];
}
}
// 处理
Search(0);
// 输出
system("pause");
return 0;
}
void Search(int depth)
{
if(depth == STEP && c[4][4] == 1){ // 到达目标位置
cout<<"找到解,倒着走如下:/n";
output(c);
findit = true;
return;
}
int x1,y1,x2,y2;
for(int i=1;i<=MAXN;i++){
for(int j=1;j<=MAXN;j++){
if(c[i][j]==IN){ // 有棋子
for(int k=0;k<4;k++){ // 4个方向
x1 = i+pass[k][0];
y1 = j+pass[k][1];
x2 = i+reach[k][0];
y2 = j+reach[k][1];
if(x1>=1&&x1<=MAXN&&y1>=1&&y2<=MAXN&&c[x1][y1]==IN //跳过位置还有子
&&x2>=1&&x2<=MAXN&&y2>=1&&y2<=MAXN&&c[x2][y2]==NOTIN){ //达到为位置为空
c[i][j]=NOTIN; // 初始位置置空
c[x1][y1]=NOTIN; // 跳过位置置空
c[x2][y2]=IN; // 跳到的位置置为peg
Search(depth+1); // 跳到目标位置
c[i][j]=IN; // 还原
c[x1][y1]=IN;
c[x2][y2]=NOTIN;
if(findit == true){
output(c);
return;
}
}
}
}
}
}
}
void output(int c[][MAXN+1])
{
cout<<"*********************************************************/n";
for(int i=1;i<=MAXN;i++){
for(int j=1;j<=MAXN;j++){
cout<<c[i][j]<<" ";
}
cout<<"/n";
}
}
第二种:常用方法深度搜索的open集和closed集算法,用堆是为了给启发式模板准备.
#ifnde