钻石独立棋的用HASH表和栈改进版

原创 2004年10月19日 00:35:00

  虽然只是小程序,呵呵,顺便多学点STL吧,就把它由原来的遍历搜索改成用HASHMAP存储改进,时间加快了不少哦,嗯,HASHKEY有二种,一种就用一个LONG LONG来表示,呀,刚好多了二位,不然INT就够了,另一种就用一串STRING来了,这里是用STRING的,这样的搜索模板就更完整了哦:)
/*
CODY BY 我的BLOG AT 2004.10.9
独立钻石棋问题, 深度优先搜索,尽量清除重复点
2004.10.18
利用HASHMAP改进CLOSED集,利用STACK改进OPEN集.

棋盘编号布局如下:
      01 02 03
      04 05 06
07 08 09 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
   28 29 30
   31 32 33
*/
#include <iostream>
#include <fstream>
#include <algorithm>
#include <stack>
#include <string>
#include <hash_map>

#include "Node.h"
using namespace std;
using namespace stdext;

stack<Node> open;
hash_map<string,Node> closed;
typedef pair <string, Node> Pair;
hash_map<string,Node>:: const_iterator rcIter;


// 判断next结点是否已扩展过,是返回true,否则false
bool extended(Node &next);
// 搜索解
void search();

int main(void)
{
 search();
 system("pause");
 return 0;
}

void search()
{
 // 初始化
 Node first;
 for(int i=1;i<=33;i++){
  first.c[i] = 1;
 }
 first.c[17] = 0;
 first.key = 0;
 open.push(first);

 // 开始循环
 while(!open.empty()){
  //cout<<"正在搜索......         已扩展结点:"<<closed.size()<<"/n";
  Node tmp = open.top();
  open.pop();

  // 看所取节点是否为目标节点
  if(tmp.moveid[0] >= 31 && tmp.c[17] == 1){
   tmp.output(cout);      // 输出解并返回
   ofstream out("out.txt");
   tmp.output(out);      
   return ;
  }

  // 若不是则生成所有的子状态
  Node next;
  bool hadit;
  for(int i = 1;i <= 33 ;i++){
   if(tmp.c[i] != 0){
    if( tmp.down(i,next)){
     if(extended(next) == false){ // 还没扩展过
      open.push(next);
     }
    }
    if( tmp.up(i,next)){
     if(extended(next) == false){ // 还没扩展过
      open.push(next);
     }
    }
    if( tmp.left(i,next)){
     if(extended(next) == false){ // 还没扩展过
      open.push(next);
     }
    }
    if( tmp.right(i,next)){
     if(extended(next) == false){ // 还没扩展过
      open.push(next);
     }
    }
   }
  }
  // 将刚才取出的open点放入closed表
  closed.insert ( Pair(tmp.getHashKey(),tmp));
 }
}

bool extended(Node &next)
{
 // 若next在closed中,即已扩展过了,返回true
 rcIter = closed.find(next.getHashKey());
 if(rcIter == closed.end()){
  return false;
 }else{
  return true;
 }
}

独立钻石棋详解

独立钻石棋详解
  • nameofcsdn
  • nameofcsdn
  • 2016年11月06日 01:14
  • 2124

独立钻石棋(Diamond Chess)算法

第一种方法,深度搜索的递归方法/*CODE BY 我的BLOG AT 2004.10.13独立钻石棋问题深度搜索,递归调用法*/#include#includeusing namespace std;...
  • pipopipo
  • pipopipo
  • 2004年10月09日 00:43
  • 2358

Hopping dots (独立钻石棋变种)攻略

Hopping dots (独立钻石棋变种)攻略
  • nameofcsdn
  • nameofcsdn
  • 2017年03月08日 17:03
  • 1927

独立钻石棋

独立钻石棋
  • nameofcsdn
  • nameofcsdn
  • 2016年11月05日 16:14
  • 1592

独立钻石跳棋问题的C++实现

/**********************************说明***********************************//*问题描述:    独立钻石跳棋问题。在下图中,33...
  • cichyn
  • cichyn
  • 2006年05月09日 23:52
  • 1614

3dsMax学习笔记12_VRay混合材质制作钻戒材质

1.钻石材质:镀膜材质1:VRayMtl材质-漫反射:黑色;反射:白色,勾选菲涅尔反射;折射:白色,折射率:2.417,双向反射分布函数:多面;选项:去除双面 镀膜材质2:VRayMtl材质-漫反射:...
  • stromlord
  • stromlord
  • 2017年02月15日 12:58
  • 476

同一进程间的线程共享和独立的资源

共享的资源有 a. 堆  由于堆是在进程空间中开辟出来的,所以它是理所当然地被共享的;因此new出来的都是共享的(16位平台上分全局堆和局部堆,局部堆是独享的) b. 全局变量 它是与具体某一函数...
  • bxw1992
  • bxw1992
  • 2017年08月06日 13:13
  • 82

哈希表(Hash Table)原理及其实现

原理 介绍 哈希函数构造 冲突处理 举例 拉链法 hash索引跟B树索引的区别 实现原理介绍哈希表(Hash table,也叫散列表), 是根据关键码值(Key value)而直接进行访问的数据结构。...
  • c602273091
  • c602273091
  • 2017年01月31日 10:24
  • 2906

独立钻石跳棋问题

//参考 :http://blog.sina.com.cn/s/blog_510ad0640100bo3d.html#include #include using namespace std;st...
  • u012319493
  • u012319493
  • 2015年11月30日 11:47
  • 395

求助独立钻石算法实现

问题描述:    独立钻石跳棋问题。在下图中,33个方格顶点摆放着32枚棋子,仅中央的顶点空着未摆放棋子。下棋的规则是任一棋子可以沿水平或成垂直方向跳过与其相邻的棋子,进入空着的顶点并吃掉被跳过的棋子...
  • nwsuaf_yongli
  • nwsuaf_yongli
  • 2007年06月01日 08:04
  • 276
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:钻石独立棋的用HASH表和栈改进版
举报原因:
原因补充:

(最多只允许输入30个字)