#include "csearcher.h"
CSearcher::CSearcher()
{
// m_Parents.rehash( 3000000 );
// m_ShortestPath.rehash( 3000000 );
}
bool CSearcher::Dfs(Map_t Map, const QPoint &ptSrc, const QPoint &ptDst)
{
ClearResult() ;
Sp_Point_t ptCurrent( make_shared<QPoint>( ptSrc ) ) ;
unordered_set< string > Visited ;
stack< Sp_Point_t > Stack ;
// 入工作栈
Stack.push( ptCurrent );
// 记录当前顶点的前驱顶点
m_Parents[ ptCurrent ] = ptCurrent ;
// 记录距离值
m_Distances[ ptCurrent ] = 0 ;
// 加入访问路径序列
m_Points.push_back( ptCurrent );
// 设置访问标记
Visited.insert( ToString( ptCurrent ) ) ;
for( ; Stack.size() > 0 ; )
{
// 出栈一个点
ptCurrent = Stack.top() ;
Stack.pop();
// 取得指定顶点的所有邻居顶点
vector< Sp_Point_t > AdjacentVertexes = GetAdjacentVertexes( Map , Visited , ptCurrent );
for( size_t idx = 0 ; idx < AdjacentVertexes.size() ; ++idx )
{
Sp_Point_t pt = AdjacentVertexes[ idx ] ;
// 入工作栈
Stack.push( pt );
// 设置访问标记
Visited.insert( ToString( pt ) ) ;
// 记录当前顶点的前驱顶点
m_Parents[ pt ] = ptCurrent ;
// 记录距离值
m_Distances[ pt ] = m_Distances[ ptCurrent ] + 1 ;
// 把当前顶点加入访问路径序列
m_Points.push_back( pt );
// 访问顶点
if( *pt == ptDst )
{
m_ptDst = pt ;
return true ;
}
}
}
return false ;
}
bool CSearcher::Bfs(Map_t Map, const QPoint &ptSrc, const QPoint &ptDst)
{
ClearResult() ;
Sp_Point_t ptCurrent( make_shared<QPoint>( ptSrc ) ) ;
unordered_set< string > Visited ;
queue< Sp_Point_t > Queue ;
// 入工作栈
Queue.push( ptCurrent );
// 记录当前顶点的前驱顶点
m_Parents[ ptCurrent ] = ptCurrent ;
// 记录距离值
m_Distances[ ptCurrent ] = 0 ;
// 加入访问路径序列
m_Points.push_back( ptCurrent );
// 设置访问标记
Visited.insert( ToString( ptCurrent ) ) ;
for( ; Queue.size() > 0 ; )
{
// 出栈一个点
ptCurrent = Queue.front() ;
Queue.pop();
// 取得指定顶点的所有邻居顶点
vector< Sp_Point_t > AdjacentVertexes = GetAdjacentVertexes( Map , Visited , ptCurrent );
for( size_t idx = 0 ; idx < AdjacentVertexes.size() ; ++idx )
{
Sp_Point_t pt = AdjacentVertexes[ idx ] ;
// 入工作栈
Queue.push( pt );
// 设置访问标记
Visited.insert( ToString( pt ) ) ;
// 记录当前顶点的前驱顶点
m_Parents[ pt ] = ptCurrent ;
// 把当前顶点加入访问路径序列
m_Points.push_back( pt );
// 记录距离值
m_Distances[ pt ] = m_Distances[ ptCurrent ] + 1 ;
// 访问顶点
if( *pt == ptDst )
{
m_ptDst = pt ;
return true ;
}
}
}
return false ;
}
bool CSearcher::DfsRandomly(Map_t Map, const QPoint &ptSrc, const QPoint &ptDst)
{
ClearResult() ;
size_t nCounter = 0 ;
Sp_Point_t pt = make_shared<QPoint>( ptSrc ) ;
unordered_set< string > Visited ;
stack< Sp_Point_t > Stack ;
// 入工作栈
Stack.push( pt );
// 记录当前顶点的前驱顶点
m_Parents[ pt ] = pt ;
// 记录距离值
m_Distances[ pt ] = 0 ;
// 加入访问路径序列
m_Points.push_back( pt );
// 设置访问标记
Visited.insert( ToString( pt ) ) ;
// 访问顶点
m_VisitOrders[ pt ] = nCounter++ ;
if( *pt == ptDst )
{
m_ptDst = pt ;
return true ;
}
for( ; Stack.size() > 0 ; )
{
// 出栈一个点
Sp_Point_t ptCurrent = Stack.top() ;
Stack.pop();
// 取得指定顶点的所有邻居顶点
vector< Sp_Point_t > AdjacentVertexes = GetAdjacentVertexes( Map , Visited , ptCurrent );
for( ; AdjacentVertexes.size() > 0 ; )
{
// 从邻居顶点列表中,随机抽出一个顶点
int idx = rand() % AdjacentVertexes.size() ;
Sp_Point_t pt = AdjacentVertexes[ idx ] ;
AdjacentVertexes.erase( AdjacentVertexes.begin() + idx ) ;
// 入工作栈
Stack.push( pt );
// 设置访问标记
Visited.insert( ToString( pt ) ) ;
// 记录当前顶点的前驱顶点
m_Parents[ pt ] = ptCurrent ;
// 记录距离值
m_Distances[ pt ] = m_Distances[ ptCurrent ] + 1 ;
// 把当前顶点加入访问路径序列
m_Points.push_back( pt );
// 访问顶点
m_VisitOrders[ pt ] = nCounter++ ;
if( *pt == ptDst )
{
m_ptDst = pt ;
return true ;
}
}
}
return false ;
}
bool CSearcher::BfsRandomly(Map_t Map, const QPoint &ptSrc, const QPoint &ptDst)
{
ClearResult() ;
size_t nCounter = 0 ;
Sp_Point_t pt = make_shared<QPoint>( ptSrc ) ;
unordered_set< string > Visited ;
queue< Sp_Point_t > Queue ;
// 入工作栈
Queue.push( pt );
// 记录当前顶点的前驱顶点
m_Parents[ pt ] = pt ;
// 记录距离值
m_Distances[ pt ] = 0 ;
// 加入访问路径序列
m_Points.push_back( pt );
// 设置访问标记
Visited.insert( ToString( pt ) ) ;
// 访问顶点
m_VisitOrders[ pt ] = nCounter++ ;
if( *pt == ptDst )
{
m_ptDst = pt ;
return true ;
}
for( ; Queue.size() > 0 ; )
{
// 出栈一个点
Sp_Point_t ptCurrent = Queue.front() ;
Queue.pop();
// 取得指定顶点的所有邻居顶点
vector< Sp_Point_t > AdjacentVertexes = GetAdjacentVertexes( Map , Visited , ptCurrent );
for( ; AdjacentVertexes.size() > 0 ; )
{
// 从邻居顶点列表中,随机抽出一个顶点
int idx = rand() % AdjacentVertexes.size() ;
Sp_Point_t pt = AdjacentVertexes[ idx ] ;
AdjacentVertexes.erase( AdjacentVertexes.begin() + idx ) ;
// 入工作栈
Queue.push( pt );
// 设置访问标记
Visited.insert( ToString( pt ) ) ;
// 记录当前顶点的前驱顶点
m_Parents[ pt ] = ptCurrent ;
// 记录距离值
m_Distances[ pt ] = m_Distances[ ptCurrent ] + 1 ;
// 把当前顶点加入访问路径序列
m_Points.push_back( pt );
// 访问顶点
m_VisitOrders[ pt ] = nCounter++ ;
if( *pt == ptDst )
{
m_ptDst = pt ;
return true ;
}
}
}
return false ;
}
std::string CSearcher::ToString(const QPoint &pt)
{
format fmt( "%d#%d" ) ;
fmt.bind_arg( 1 , pt.x() ) ;
fmt.bind_arg( 2 , pt.y() ) ;
return fmt.str() ;
}
std::string CSearcher::ToString( const shared_ptr<QPoint> &pt )
{
format fmt( "%d#%d" ) ;
fmt.bind_arg( 1 , pt.get()->x() ) ;
fmt.bind_arg( 2 , pt.get()->y() ) ;
return fmt.str() ;
}
vector<Sp_Point_t> CSearcher::GetAdjacentVertexes(Map_t Map, unordered_set< string > &Visited , const Sp_Point_t &pt)
{
vector<Sp_Point_t> AdjacentVertexes ;
// 上
Sp_Point_t ptTest = make_shared<QPoint>( pt->x() , pt->y() -1 ) ;
if( Map[ ptTest->y() ][ ptTest->x() ] == 0 &&
Visited.find( ToString( ptTest ) ) == Visited.end() )
{
AdjacentVertexes.push_back( ptTest );
}
// 上右
ptTest = make_shared<QPoint>( pt->x() + 1 , pt->y() - 1 ) ;
if( Map[ ptTest->y() ][ ptTest->x() ] == 0 &&
Visited.find( ToString( ptTest ) ) == Visited.end() )
{
AdjacentVertexes.push_back( ptTest );
}
// 右
ptTest = make_shared<QPoint>( pt->x() + 1 , pt->y() ) ;
if( Map[ ptTest->y() ][ ptTest->x() ] == 0 &&
Visited.find( ToString( ptTest ) ) == Visited.end() )
{
AdjacentVertexes.push_back( ptTest );
}
// 下右
ptTest = make_shared<QPoint>( pt->x() + 1 , pt->y() + 1 ) ;
if( Map[ ptTest->y() ][ ptTest->x() ] == 0 &&
Visited.find( ToString( ptTest ) ) == Visited.end() )
{
AdjacentVertexes.push_back( ptTest );
}
// 下
ptTest = make_shared<QPoint>( pt->x() , pt->y() + 1 ) ;
if( Map[ ptTest->y() ][ ptTest->x() ] == 0 &&
Visited.find( ToString( ptTest ) ) == Visited.end() )
{
AdjacentVertexes.push_back( ptTest );
}
// 下左
ptTest = make_shared<QPoint>( pt->x() - 1 , pt->y() + 1 ) ;
if( Map[ ptTest->y() ][ ptTest->x() ] == 0 &&
Visited.find( ToString( ptTest ) ) == Visited.end() )
{
AdjacentVertexes.push_back( ptTest );
}
// 左
ptTest = make_shared<QPoint>( pt->x() - 1 , pt->y() ) ;
if( Map[ ptTest->y() ][ ptTest->x() ] == 0 &&
Visited.find( ToString( ptTest ) ) == Visited.end() )
{
AdjacentVertexes.push_back( ptTest );
}
// 上左
ptTest = make_shared<QPoint>( pt->x() - 1 , pt->y() - 1 ) ;
if( Map[
处处清欢
- 粉丝: 2104
- 资源: 2876
最新资源
- Canoe-Autosar网络管理自动化测试脚本 Capl源码,全套,修改项目配置可以直接使用 1.启动程序 2.加载配置文件 3.选择帧类型(标准帧或扩展帧) 4.修改配置文件,自动弹出配置文件
- 特斯拉初代Roadster开源文件.zip
- 基于GAM模型改进的DID与CIC半参数因果学习方法研究
- 基于LADRC自抗扰控制的VSG三相逆变器预同步并网控制策略 基于LADRC自抗扰控制的VSG三相逆变器预同步并网控制策略是一种用于实现逆变器在微电网中的协调运行的先进控制策略 逆变器控制方式采用同
- 新能源插件组装机母头(sw20可编辑+工程图)全套技术资料100%好用.zip
- 图像处理领域中基于改进Ostu法的大鼠精子图像分割及计数算法
- 基于fpga的视频缩放算法,支持4k2k输入,4k2k输出,缩放参数可控
- 循环式倍速链电梯LIOP生产sw19可编辑全套技术资料100%好用.zip
- 用友U8 数据库说明 用友U8系列的数据字典
- Natural Language Processing
- 液压系统减振降噪优化设计ANSYS workbench
- 旋转停车场结构模型creo5.0全套技术资料100%好用.zip
- 一种改进的粒子群优化算法-MATLAB 2023年提出 改进包含: 1、改进惯性权重 2、改进学习因子
- DirectX修复工具(DirectX Repair)修复工具V4.0增强版
- 预绝缘端子sw20可编辑全套技术资料100%好用.zip
- Autosar developer 生成 rte 和 configure 配置 协议栈
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈