HDU 1728 逃离迷宫(BFS的优化)
这一题,有两个地方需要注意:(除了题目令人窒息的行列的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的优化)相关推荐
- hdu 1728 逃离迷宫 (bfs)
逃离迷宫 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- HDU - 1728 逃离迷宫(bfs)
题目链接:点击查看 题目大意:给出起点和终点和最多的拐弯次数k,问拐弯次数能否在小于等于k的情况下从起点到达终点 题目分析:bfs,不过和以往的不太一样,以往的bfs都是每次加入一个点,而这个题目的限 ...
- HDU 1728 逃离迷宫【BFS】
题意:给出一个起点,一个终点,规定的转弯次数,问能否在规定的转弯次数内到达终点--- 这一题是学(看)习(题)的(解)@_@ 主要学了两个地方 一个是剪枝,如果搜到的当前点的转弯次数小于该点turn数 ...
- hdu 1728 逃离迷宫(dFS+优先队列)
求转弯最少的走路方式!!!! #include<stdio.h> #include<string.h> #include<queue> using namespac ...
- HDU 1728 逃离迷宫
给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位 ...
- hdoj 1728 逃离迷宫
逃离迷宫 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- HDU ACM 1728 逃离迷宫 (广搜BFS)
http://acm.hdu.edu.cn/showproblem.php?pid=1728 题意:给出一张图,转弯数k,起点(x1,y1),(x2,y2)判断能不能最多只转k个弯时从起点走到终点 输 ...
- hdu_1728_逃离迷宫(bfs)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1728 题意:走迷宫,找最小的拐角 题解:对BFS有了新的理解,DFS+剪枝应该也能过,用BFS就要以拐 ...
- 逃离迷宫 ( BFS /DFS)
逃离迷宫 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...
最新文章
- 力扣(LeetCode)刷题,简单题(第12期)
- 机器学习算法一览,应用建议与解决思路
- 在LINUX上配置oracle ASMLib的多路径磁盘
- 了解OPhone平台---OPhone平台架构和主要开发组件
- linux虚拟主机泛解析,Apache虚拟主机的配置和泛域名解析实现代码
- android正则判断两个符号之间,Android字母、数字、字符任意两种组合正则验证
- vb光环褪去java、c/c++/c#成编程主流
- 台式计算机技术方案,2017年4月自考02316计算机应用技术真题及答案
- List 去重的 6 种方法,这个方法最完美!
- SpaceX星舰飞船首次试飞成功着陆!但没想到还是爆炸了...
- Python之Pandas库常用函数大全(含注释)
- mysql GROUP_CONCAT 排序
- 2048小游戏——网页版(基础篇)
- 微信整人假红包图片_微信整人假红包 仿真整人红包图片
- 【MM32F5270开发板试用】+ TFTLCD IO口方式驱动
- 异常声音检测之kaldi DNN 训练
- java水彩画效果滤镜,PS通过滤镜给照片制作水彩画效果
- arcgis制图汇总
- 纽约市建筑能源得分预测代码分析
- 2021年下半年市场营销案例分析集锦
热门文章
- 拼多多拼单显示内部服务器错误,拼多多为什么拼不了?拼多多怎么拼单?
- vue统一或单独控制接口请求时间
- 聚合易支付,支付宝免签约即时到账,财付通免签约,微信免签约支付,QQ钱包免签约,免签约支付
- Zbrush一些基本操作
- 使用ZBrush软件的画布功能有什么技巧吗?
- 大数据多维分析常用操作图解 OLAP Operations
- 安卓九宫格上传图片(微信朋友圈,QQ动态)小demo
- OpenCv-C++-小案例实战-切边(二)
- 动手实现一个docker引擎-1-从内核到docker的三驾马车
- gradient设置上下渐变_CSS3 渐变