对于搜索树分支很多且有明确起点和终点的情况时,可以采用双向搜索来减小搜索树的大小。

对于双向BFS来说,与单向最大的不同是双向BFS需要按层扩展,表示可能到达的区域。而单向BFS则是按照单个节点进行扩展,因为只有当前状态。

代码如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn=810; char mp[maxn][maxn];
int n,m,tot,step,f;
struct node{
int x,y;
}boy,girl,ghost[2];
queue<node> q[2];//两个队列
bool vis[2][maxn][maxn];//两个表示可达性 void init(){
tot=0;
while(q[0].size())q[0].pop();
while(q[1].size())q[1].pop();
memset(vis,0,sizeof(vis));
} void read_and_parse(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%s",mp[i]+1);
for(int j=1;j<=m;j++){
if(mp[i][j]=='M')boy=(node){i,j};
if(mp[i][j]=='G')girl=(node){i,j};
if(mp[i][j]=='Z')ghost[tot++]=(node){i,j};
}
}
} bool right(int x,int y){
if(x<1||x>n||y<1||y>m||mp[x][y]=='X')return 0;
if(abs(x-ghost[0].x)+abs(y-ghost[0].y)<=step<<1)return 0;
if(abs(x-ghost[1].x)+abs(y-ghost[1].y)<=step<<1)return 0;
return 1;
} const int dx[]={0,0,1,-1};
const int dy[]={1,-1,0,0}; bool bfs(int idx){
int size=q[idx].size();
while(size--){
node now=q[idx].front();q[idx].pop();
if(!right(now.x,now.y))continue;//查看当前状态是否合法 for(int i=0;i<4;i++){
int x=now.x+dx[i],y=now.y+dy[i];
if(!right(x,y)||vis[idx][x][y])continue;
if(vis[1-idx][x][y])return 1;
vis[idx][x][y]=1;
q[idx].push((node){x,y});
}
}
return 0;
} void solve(){
step=0,f=0;
q[0].push((node){boy.x,boy.y});
q[1].push((node){girl.x,girl.y}); while(q[0].size()||q[1].size()){
++step;
for(int i=1;i<=3;i++)if(bfs(0)){f=1;break;}//每次扩展三层,表示走三步可能到达的状态
if(bfs(1)){f=1;break;}
} if(f)printf("%d\n",step);
else puts("-1");
} int main(){
int T;scanf("%d",&T);
while(T--){
init();
read_and_parse();
solve();
}
return 0;
}

最新文章

  1. ViewStub源码分析
  2. sparksql udf的运用----scala及python版(2016年7月17日前完成)
  3. X86 Socket 通信
  4. VPS拨号主机自动拨号脚本(centos7)
  5. window2008 r2 负载均衡
  6. VBA_Excel_教程:分枝循环结构
  7. Navicat for MySQL Mac 破解版
  8. grootJs 属性过滤器
  9. 101. Symmetric Tree
  10. C++学习笔记之输入、输出和文件
  11. loadrunner协议的选择
  12. 【转】如何在IOS中使用3D UI - CALayer的透视投影
  13. PLSQL过期:Your trial period for PL/SQL Developer is over .If you want to continue using this software ,you must purchase the retail version.
  14. PHP基础学习----字符串操作
  15. WireShark如何抓取本地localhost的包
  16. js删除map中元素
  17. 主窗口QMainWindow和启动画面
  18. Chapter 2 Open Book——25
  19. Timer-triggered memory-to-memory DMA transfer demonstrator
  20. Oralce数据库的优化(面试必问题)

热门文章

  1. RabbitMQ 优先级队列-为队列赋权
  2. jenkins中配置svn 出现absolute path is not allowed
  3. 把cnblogs变成简书 - cnblogs博客自定义皮肤css样式
  4. Linux 第八周实验 进程的切换和系统的一般执行过程
  5. 第三个Sprint冲刺总结
  6. Java控制台常用命令
  7. MongoDb在windows10下的安装、创建用户和数据库
  8. 美化centos7
  9. TensorFlow中的优化算法
  10. Axure8.0从入门到精通