独立钻石棋(Diamond Chess)算法

第一种方法,深度搜索的递归方法
/*
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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值