这一题,有两个地方需要注意:(除了题目令人窒息的行列的x y设置)

①转弯如何判断?

需要给转弯的方向赋值。通常,我们在节点向四个方向延伸的时候,喜欢这样

int nextx[4]={0,0,-1,1};//下一个的行
int nexty[4]={1,-1,0,0};//下一个的列for(int i=0;i<4;i++)
{Point nextp;nextp.x=curp.x+nextx[i];nextp.y=curp.y+nexty[i];/*........*/
}

那既然你已经定义了i,为啥不直接用i来代表转弯的方向呢?

所以,i从0到3   分别代表了  右 左 上 下。

我们从队首取出一个节点curp,由这个节点向四个方向扩展的下一个节点是nextp。

显然,nextp的上一个结点(curp)   转弯的方向lastturn  就是 i。

(人家怎么都是用dir,,,然后我想了半天不动dir是啥,,,我这理解应该是对的叭)

②MLE 怎么办?

找个数组记录一下,走到当前位置最少需要几个转弯数?

每次更新一下。如果比当前位置的转弯数大,那根本没有必要再存队列里了,对吧。

不然内存使用你会疯掉的。

你看,我各种优化,大于K了不行赶紧扔掉:

然后优化的时候还一不小心搞错了。。。

 /*问题出在,,虽然已经达到转弯的最大次数,但是接下来可以直直地走到终点。if(nextp.turn == k){if(nextp.x !=endx || nextp.y !=endy)continue;}*/

接下来,放上自己各种参考的代码:

//HDU 1728
//AC
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>using namespace std;//right left up down
int nextx[4]={0,0,-1,1};
int nexty[4]={1,-1,0,0};
char mp[105][105];
int leastturn[105][105];
int k,startx,starty,endx,endy;
int m,n;struct Point
{int x;int y;int turn;int lastturn;//上一次转弯的方向
};void BFS(int startx,int starty)
{queue<Point> q;Point startp;startp.x=startx;startp.y=starty;startp.turn=0;startp.lastturn=-3;q.push(startp);while(!q.empty()){Point curp=q.front();q.pop();//是否是终点if(curp.x==endx && curp.y==endy && curp.turn<=k){cout<<"yes"<<endl;return ;}//是否超过允许的拐弯数量if(curp.turn >k )continue;for(int i=0;i<4;i++){Point nextp;nextp.x=curp.x+nextx[i];nextp.y=curp.y+nexty[i];//在迷宫的范围内,且可以走if(nextp.x>=1 && nextp.x<=m && nextp.y>=1 && nextp.y<=n && mp[nextp.x][nextp.y]!='*'){//判断有没有拐弯。跟上一次 的方向 不相同if(curp.lastturn !=i && curp.lastturn !=-3 )//拐弯了{nextp.turn=curp.turn+1;nextp.lastturn=i;if(nextp.turn > k)continue;/*问题出在,,虽然已经达到转弯的最大次数,但是接下来可以直直地走到终点。if(nextp.turn == k){if(nextp.x !=endx || nextp.y !=endy)continue;}*/if(nextp.turn <= leastturn[nextp.x][nextp.y]){leastturn[nextp.x][nextp.y]=nextp.turn;q.push(nextp);}}else{nextp.turn=curp.turn;nextp.lastturn=i;if(nextp.turn > k)continue;/*   if(nextp.turn == k){if(nextp.x !=endx || nextp.y !=endy)continue;}*/if(nextp.turn <= leastturn[nextp.x][nextp.y]){leastturn[nextp.x][nextp.y]=nextp.turn;q.push(nextp);}}}}}cout<<"no"<<endl;
}int main()
{int t;cin>>t;while(t--){cin>>m>>n;for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){cin>>mp[i][j];leastturn[i][j]=INT_MAX;}}cin>>k>>starty>>startx>>endy>>endx;BFS(startx,starty);}
}

HDU 1728 逃离迷宫(BFS的优化)相关推荐

  1. hdu 1728 逃离迷宫 (bfs)

    逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  2. HDU - 1728 逃离迷宫(bfs)

    题目链接:点击查看 题目大意:给出起点和终点和最多的拐弯次数k,问拐弯次数能否在小于等于k的情况下从起点到达终点 题目分析:bfs,不过和以往的不太一样,以往的bfs都是每次加入一个点,而这个题目的限 ...

  3. HDU 1728 逃离迷宫【BFS】

    题意:给出一个起点,一个终点,规定的转弯次数,问能否在规定的转弯次数内到达终点--- 这一题是学(看)习(题)的(解)@_@ 主要学了两个地方 一个是剪枝,如果搜到的当前点的转弯次数小于该点turn数 ...

  4. hdu 1728 逃离迷宫(dFS+优先队列)

    求转弯最少的走路方式!!!! #include<stdio.h> #include<string.h> #include<queue> using namespac ...

  5. HDU 1728 逃离迷宫

    给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位 ...

  6. hdoj 1728 逃离迷宫

    逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  7. HDU ACM 1728 逃离迷宫 (广搜BFS)

    http://acm.hdu.edu.cn/showproblem.php?pid=1728 题意:给出一张图,转弯数k,起点(x1,y1),(x2,y2)判断能不能最多只转k个弯时从起点走到终点 输 ...

  8. hdu_1728_逃离迷宫(bfs)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1728 题意:走迷宫,找最小的拐角 题解:对BFS有了新的理解,DFS+剪枝应该也能过,用BFS就要以拐 ...

  9. 逃离迷宫 ( BFS /DFS)

    逃离迷宫 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...

最新文章

  1. 力扣(LeetCode)刷题,简单题(第12期)
  2. 机器学习算法一览,应用建议与解决思路
  3. 在LINUX上配置oracle ASMLib的多路径磁盘
  4. 了解OPhone平台---OPhone平台架构和主要开发组件
  5. linux虚拟主机泛解析,Apache虚拟主机的配置和泛域名解析实现代码
  6. android正则判断两个符号之间,Android字母、数字、字符任意两种组合正则验证
  7. vb光环褪去java、c/c++/c#成编程主流
  8. 台式计算机技术方案,2017年4月自考02316计算机应用技术真题及答案
  9. List 去重的 6 种方法,这个方法最完美!
  10. SpaceX星舰飞船首次试飞成功着陆!但没想到还是爆炸了...
  11. Python之Pandas库常用函数大全(含注释)
  12. mysql GROUP_CONCAT 排序
  13. 2048小游戏——网页版(基础篇)
  14. 微信整人假红包图片_微信整人假红包 仿真整人红包图片
  15. 【MM32F5270开发板试用】+ TFTLCD IO口方式驱动
  16. 异常声音检测之kaldi DNN 训练
  17. java水彩画效果滤镜,PS通过滤镜给照片制作水彩画效果
  18. arcgis制图汇总
  19. 纽约市建筑能源得分预测代码分析
  20. 2021年下半年市场营销案例分析集锦

热门文章

  1. 拼多多拼单显示内部服务器错误,拼多多为什么拼不了?拼多多怎么拼单?
  2. vue统一或单独控制接口请求时间
  3. 聚合易支付,支付宝免签约即时到账,财付通免签约,微信免签约支付,QQ钱包免签约,免签约支付
  4. Zbrush一些基本操作
  5. 使用ZBrush软件的画布功能有什么技巧吗?
  6. 大数据多维分析常用操作图解 OLAP Operations
  7. 安卓九宫格上传图片(微信朋友圈,QQ动态)小demo
  8. OpenCv-C++-小案例实战-切边(二)
  9. 动手实现一个docker引擎-1-从内核到docker的三驾马车
  10. gradient设置上下渐变_CSS3 渐变