在信息竞赛中,常常会遇到一些用广度优先搜索才能实现的题目,而这类题目很大一部分都可以用双向宽搜来提高搜索速度,

这类题目的共同点是:

1。   起始状态和目标状态都很明确;

2。  搜索一条从起始状态道目标状态的最短路径。

3。 规则具有对称性,既如果原规则向左,则其相反规则就是向右,双向时,从目标状态像起始状态搜索时,需要将规则对称。

双向宽搜的思路为分别以目标状态和初始状态为起点,分别扩展节点,当扩展到相同的节点时,就找到了目标,最短路径为起始状态和目标状态到搜索到的点的路径之和。下面附图

具体实现过程如下(C++党老老实实的手打队列吧哈哈)

int head[2],tail[2],queue[maxn][2],ji[maxn][2];void checkmeet(int t)
{检查新扩展的节点是否在另一个搜索状态中出现过;出现过:输出并退出程序;
} void expand(int t)
{head[t]++;for(按规则扩展){判重;入队;checkmeet(t); //检查是否相遇 }
}void DoubleBFS()
{head[0]=;tail[0]=;head[1]=;tail[1]=;queue[1][1]=目标状态;queue[0][1]=起始状态;ji[1][1]=;ji[0][1]=;        //初始化while(head[0]<tail[0]&&head[1]<tail[1]){if(tail[0]<tail[1])expand(0);elseexpand(1); }
} 

经典例题  八数码简单题:

#include<cstdio>
#include<iostream>
#include<set>
#include<string.h>
#include <cstdlib>using namespace std;
string st,en;
int ans,head[2],tail[2];
string s[100005][2];
int    b[100005][2];
set<string>hash[2];void checkmeet(int t)
{if(hash[1-t].count(s[tail[t]][t])){for(int i=1;i<=tail[1-t];i++)if(s[i][1-t]==s[tail[t]][t]){printf("%d\n",b[i][1-t]+b[tail[t]][t]);break;}exit(0);}
}string get(string s,int i)
{string t=s;int lwz=s.find('0');if(i==1){if(lwz<3) return "-1";swap(t[lwz],t[lwz-3]);return t;}if(i==2){if(lwz==0||lwz==3||lwz==6) return "-1";swap(t[lwz],t[lwz-1]);return t;}if(i==3){if(lwz>5) return "-1";swap(t[lwz],t[lwz+3]);return t;}if(i==4){if(lwz==2||lwz==5||lwz==8) return "-1";swap(t[lwz],t[lwz+1]);return t;}
}void expand(int t)
{head[t]++;string ss=s[head[t]][t];int c=b[head[t]][t]+1;for(int i=1;i<=4;i++){string stmp=get(ss,i);if(stmp=="-1"||hash[t].count(stmp))continue;else{hash[t].insert(stmp);tail[t]++;b[tail[t]][t]=c;s[tail[t]][t]=stmp;checkmeet(t);}}
}void DoubleBFS()
{head[0]=0;tail[0]=1;head[1]=0;tail[1]=1;s[1][0]=st;s[1][1]="123804765";while(head[0]<tail[0]&&head[1]<tail[1])if(tail[0]<tail[1])expand(0);else expand(1);
}int main()
{cin>>st;DoubleBFS();
}

用双向宽搜来提高搜索效率相关推荐

  1. 超级网搜(SuperSearch) - 3.6版,一次关键字输入,多个引擎同时搜索,提高搜索效率,减少解决问题的时间

    超级网搜(SuperSearch) - 3.6版本放出. 介绍 免费.快速.高效的多引擎搜索工具,拥有数十个搜索引擎和详细的搜索分类.主要功能和特点如下: 一次关键字输入,多个引擎同时搜索,提高搜索效 ...

  2. P1379 八数码难题 题解(双向宽搜)

    博客园同步 原题链接 简要题意: 给定一个 3 × 3 3 \times 3 3×3 的矩阵,每次可以把空格旁边(四方向)的一个位置移到空格上.求到目标状态的最小步数. 前置知识: 单向宽搜的写法 O ...

  3. 百度搜索限定时间_几个方法教你用好手中的搜索,提高搜索效率和质量

    在信息过载的当下,即便我们不去主动获取信息,各种应用推荐和用户生产的内容,也会把我们裹挟其中,但其中真正有价值的内容,实际上可能是少之又少. 每个人都会面临「时间有限」的约束,如何从信息浪潮中快速找到 ...

  4. 【Elasticsearch】使用Elasticsearch中的copy_to来提高搜索效率

    1.概述 转载:使用Elasticsearch中的copy_to来提高搜索效率 在今天的这个教程中,我们来着重讲解一下如何使用Elasticsearch中的copy来提高搜索的效率.比如在我们的搜索中 ...

  5. NOI openjudge 6043:哆啦A梦的时光机(双向宽搜)

    在线评测: http://noi.openjudge.cn/ch0407/6043/ 整体思路: 这种题随便宽搜一下就好了,没啥思路可讲,,,, 失误之处: 1.开始脑子里想的是一面扩展一层,这样子可 ...

  6. 如何使用google提高搜索效率

    Google(www.Google.com),由两个斯坦福大学博士生Larry Page与Sergey Brin于1998年9月发明,Google Inc. 于1999年创立.2000年7月份,Goo ...

  7. 善用垂直搜索工具,提高搜索效率

    垂直搜索包括了站内搜索和狭义的垂直搜索引擎两类.站内搜索大家都懂,只搜索本网站之内的结果.垂直搜索引擎指的是什么呢?举个栗子,在爱奇艺视频上搜索一个电影名称,出来的结果可能不仅仅是爱奇艺站内的,也有来 ...

  8. noip2002 字串变换 (双向宽搜,交替扩展)

    P1124字串变换 Accepted 标签:搜索 搜索与剪枝NOIP提高组2002 描述 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -& ...

  9. 75: libreoj #10028 双向宽搜

    $des$ 实现一个bfs $sol$ 写了一个双向bfs #include <bits/stdc++.h>using namespace std;#define Rep(i, a, b) ...

最新文章

  1. 学好单片机能找什么工作?单片机好学吗?
  2. bugku ctf 域名解析
  3. C语言试题十二之m个人的成绩存放在score数组中,请编写函数function,它的功能是:将低于平均分的人数作为函数值返回,将低于平均分的分数放在below所指定的数组中。
  4. leetcode312. 戳气球(动态规划)
  5. CUDA TOOlkit Programming Guide 3. Programming Interface
  6. 50岁,投资理财方面接触较少,手上有280万,该如何操作?
  7. 获取iframe子页面节点,响应浏览器宽高
  8. 上位机使用C++通过ADS协议与倍福PLC通信例程-通过变量名方式读写浮点数
  9. Android edittext 属性inputtype
  10. matlab群速度色散系数,第三章-群速度色散.ppt
  11. 快速导出PDF文件中所有图片(使用Adobe Acrobat 10 )
  12. Codeforces Round #322 A Vasya the Hipster
  13. 让你更值钱的方法:培养稀缺
  14. 35+的测试人都去哪儿了?所谓“青春饭”真的只是在贩卖焦虑吗?
  15. python画钟表代码_Python技能操作5:用代码做个能挂墙上的大钟表
  16. 9年前,字节跳动第一个安卓工程师是这样工作的
  17. 西门子1200PLC控制加KPT1200触摸屏,污水处理厂自控项目实例
  18. YOLOX升级 | 阿里巴巴提出YOLOX-PAI,1ms内精度无敌!
  19. 《Python编程 从入门到实践》第八章 ——函数习题
  20. 关于新闻类应用快速开发框架的思考

热门文章

  1. 计算机技术调剂控制工程,控制工程294求调剂 - 考研 - 小木虫 - 学术 科研 互动社区...
  2. studio 3t MongoDB for MAC 201903+Cracking
  3. Can't update table 'psxt_user' in stored function/trigger because it is already used by statement wh
  4. AOP-纵向横向的区分和基本概念
  5. C++ 算法篇 动态规划----区间动态规划
  6. python tensorflow学习笔记(五)矩阵乘法运算
  7. ipad pro无法连接wifi终极解决方法
  8. 在Mac上安装goby
  9. POI和EasyExcel实现Excel数据批量读取到数据库
  10. C++ qt实现打开关闭状态按钮