双向广搜 模板

5 篇文章 0 订阅

poj 1198 Solitaire

http://poj.org/problem?id=1198

 

void TBFS()
{
       bool found=false;
       memset(visited,0,sizeof(visited));  // 判重数组
       while(!Q1.empty())  Q1.pop();   // 正向队列
       while(!Q2.empty())  Q2.pop();  // 反向队列
       //======正向扩展的状态标记为1,反向扩展标记为2
       visited[s1.state]=1;   // 初始状态标记为1
       visited[s2.state]=2;   // 结束状态标记为2
       Q1.push(s1);  // 初始状态入正向队列
       Q2.push(s2);  // 结束状态入反向队列
       while(!Q1.empty() || !Q2.empty())
       {
              if(!Q1.empty())
                     BFS_expand(Q1,true);  // 在正向队列中搜索
              if(found)  // 搜索结束 
                     return ;
              if(!Q2.empty())
                     BFS_expand(Q2,false);  // 在反向队列中搜索
              if(found) // 搜索结束
                     return ;
       }
}
void BFS_expand(queue<Status> &Q,bool flag)
{  
       s=Q.front();  // 从队列中得到头结点s
      Q.pop()
      for( 每个s 的子节点 t )
     {
             t.state=Gethash(t.temp)  // 获取子节点的状态
             if(flag)   // 在正向队列中判断
             {
                      if (visited[t.state]!=1)// 没在正向队列出现过
                    {
                           if(visited[t.state]==2)  // 该状态在反向队列中出现过
                          {
                                 各种操作;
                                 found=true;
                                 return;
                           }
                            visited[t.state]=1;   // 标记为在在正向队列中
                            Q.push(t);  // 入队
                       }
             }
             else    // 在正向队列中判断
             {
                      if (visited[t.state]!=2) // 没在反向队列出现过
                    {
                           if(visited[t.state]==1)  // 该状态在正向向队列中出现过
                           {
                                  各种操作;
                                  found=true;
                                  return;
                            }
                             visited[t.state]=2;  // 标记为在反向队列中
                             Q.push(t);  // 入队
                       }
             }             
}                

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值