生成博弈树模拟结点(测试桩)

本文介绍了一种多叉树的生成与操作方法,包括创建、获取节点数据、子节点ID和值等基本操作。

#pragma once
#include <vector>
#include <iostream>

using namespace std;

class Chess_MoveTree
{
 //二维数组存的多叉树,标号从0开始
public:
 Chess_MoveTree(void);
 ~Chess_MoveTree(void);
 //生成多叉树,默认是生成12层的4叉树,约6百万个节点
 void Create(const int in_iTreePath = 4, const int in_iLayerNum = 12);
 int Path() { return m_iTreePath; }
 int Size() { return MoveValue.size(); }
 bool GetItemData(const int in_ID, int& out_dValue);
 //获得子结点ID,in_ID从0, in_iChildPos从0开始
 bool GetChildID(const int in_ID, const int in_iChildPos, int& out_iChildID);
 //获得子结点ID,in_ID从0, in_iChildPos从0开始
 bool GetChildData(const int in_ID, const int in_iChildPos, int& out_dChildValue);
 void Show();

private:
 void Show(const int in_ID, const int in_Layer);

 int m_iTreePath;
 vector<int> MoveValue;
};

 

////////////////////////////////////////////////////////////////

 

#include "Chess_MoveTree.h"
#include <math.h>
#include <time.h>

Chess_MoveTree::Chess_MoveTree(void)
{
 MoveValue.clear();
 m_iTreePath = 0;
 srand(time(0));
}

Chess_MoveTree::~Chess_MoveTree(void)
{
 MoveValue.clear();
}

void Chess_MoveTree::Create(const int in_iTreePath, const int in_iLayerNum)
{
 m_iTreePath = in_iTreePath;
 MoveValue.clear();
 int iTreeSize = (pow((double)m_iTreePath,in_iLayerNum)-1.0)/(m_iTreePath-1.0);
 for(int i=0; i<iTreeSize; i++)
 {
  int dValue = rand()%10000-5000;
  MoveValue.push_back(dValue);
 }
}

bool Chess_MoveTree::GetItemData(const int in_ID, int& out_dValue)
{
 if( in_ID <0 || in_ID>= Size())
  return false;
 out_dValue = MoveValue[in_ID];
 return true;
}

bool Chess_MoveTree::GetChildID(const int in_ID, const int in_iChildPos, int& out_iChildID)
{
 int iTemp = in_ID*m_iTreePath+(in_iChildPos+1);
 if( iTemp <0 || iTemp>= Size())
  return false;
 out_iChildID = iTemp;
 return true;
}

bool Chess_MoveTree::GetChildData(const int in_ID, const int in_iChildPos, int& out_dChildValue)
{
 int iTemp = in_ID*m_iTreePath+(in_iChildPos+1);
 if( iTemp <0 || iTemp>= Size())
  return false;
 out_dChildValue = MoveValue[iTemp];
 return true;
}

void Chess_MoveTree::Show()
{
 Show(0,1);
}

void Chess_MoveTree::Show(const int in_ID, const int in_Layer)
{
 int dValue;
 if( GetItemData(in_ID, dValue))
 {
  for(int i=0; i<in_Layer; i++)
   cout<<"  ";
  cout<<"("<<in_Layer<<"): ";
  cout<<dValue<<endl;
  for(int i=0; i<m_iTreePath; i++)
  {
   int iChildID = 0;
   if( GetChildID(in_ID,i, iChildID))
    Show(iChildID, in_Layer+1);
  }
 }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值