hdu 1728 bfs 最小拐弯数
来源:互联网 发布:最优化方法王开荣pdf 编辑:程序博客网 时间:2024/04/28 00:45
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1728
之前没有做过类似这种要最少拐弯数的题目,一般求最少的用bfs应该比较好。。但是之前bfs一般都是用来求最小步数,也就可以标记过走过的点不再走。现在本题要的是最小的拐弯数,所以不能标记走过的点。。需要一个数组来记录当前这个点所需要的最小拐弯数,如果此时这个点的拐弯数比之前该点的拐弯数还小或者等于就更新这个值。遍历全图直到找到解为止。
学习:对于bfs找最优解的变形。明白如何更新拐弯数的,保证最小。
背景:1、WA对于保存拐弯数的数组没有初始化为无穷。2、MLE 对于每个点要进行拐弯数的判定,只有比之前保存的值还小或者等与才入队,否则队列会爆。。3、AC后还进行了一个剪枝,但是忘了将队列中的元素弹出。结果死循环。。。 下次注意最好将队列的头元素取出之后就弹出,避免忘记。。。
判定转弯数的时候一定要是等于号。。这是别人的题解http://972169909-qq-com.iteye.com/blog/1244218 看了图就明白了。。
代码:
//hdu 1728#include<cstdio>#include<cstring>#include<queue>#define INF 10000000;using namespace std;int d1[4] = {0,0,1,-1};int d2[4] = {1,-1,0,0};int turn1[101][101];char map[101][101];int n,m,k;int ok;int sx,sy,ex,ey;struct state{int x,y;int turn;int dir;}cur,next1;void bfs(state temp){temp.dir = -1;temp.turn = 0;turn1[temp.x][temp.y] = 0;queue<state> q;q.push(temp);while(!q.empty()){cur = q.front();q.pop(); //之后最好将队列的头元素取出之后就将其弹出,避免之后忘记。。不要像以前那样写在下面。。防止剪枝的时候出错。。 if(cur.x == ex-1 && cur.y == ey-1){if(cur.turn <= k){ok = 1;printf("yes\n");return ;}}if(cur.turn > k){//q.pop(); //剪枝后没有写这句然后死循环 continue;}for(int i = 0;i < 4;i++){next1.x = cur.x + d1[i];next1.y = cur.y + d2[i];if(next1.x>=0&&next1.x<n&&next1.y>=0&&next1.y<m&&map[next1.x][next1.y]!='*'){if(cur.dir!=i &&cur.dir!=-1){next1.dir = i;next1.turn = cur.turn+1;if(next1.turn<=turn1[next1.x][next1.y])//此处必须是等于号{turn1[next1.x][next1.y] = next1.turn;q.push(next1); //一定要保证当前的转弯数是该点转弯数最小的才入队。。不然直接爆空间。。}}else {next1.dir = i;next1.turn = cur.turn;if(next1.turn<=turn1[next1.x][next1.y]){turn1[next1.x][next1.y] = next1.turn;q.push(next1);}}}}//q.pop();}}int main (){int t;scanf("%d",&t);while(t--){ok = 0;scanf("%d %d",&n,&m);for(int i = 0;i < n;i++)for(int j = 0;j < m;j++)turn1[i][j] = INF;for(int i = 0;i < n;i++)scanf("%s",map[i]);scanf("%d%d%d%d%d",&k,&sy,&sx,&ey,&ex);cur.x = sx-1;cur.y = sy-1;bfs(cur);if(!ok) printf("no\n");}return 0;}
0 0
- hdu 1728 bfs 最小拐弯数
- hdu 1728 bfs 变形最小转弯数
- HDOJ 1728 逃离迷宫(BFS + 记录拐弯次数)
- HDOJ 1728 逃离迷宫(BFS,拐弯次数最少)
- 【hdu 1728】 逃离迷宫 广搜(最少拐弯次数)
- hdu-1728逃离迷宫(dfs 求拐弯次数)
- BFS hdu 1728 逃离迷宫 转弯数
- hdu1728逃离迷宫(bfs,拐弯问题)
- 最小步数 n 58 bfs
- BFS——最小步数 续
- NYOJ 58 最小步数【bfs】
- nyoj 58 最小步数(bfs)
- NYOJ 58 最小步数【bfs&dfs】
- NYOJ 58 最小步数(BFS)
- nyoj 58 最小步数(入门bfs)
- NYOJ 58 最小步数(BFS && DFS)
- nyoj 58 最小步数问题 BFS
- NYOJ 58 最小步数(bfs)
- ubuntu 的Grub启动
- 20150321_01开博目的
- unity3d移动平台性能优化专题(11):脚本细节
- 利用ip和netmask计算相关地址的js实现
- 分类算法之逻辑回归
- hdu 1728 bfs 最小拐弯数
- Greenplum安装
- AD去抖动之软件滤波
- Android项目svn代码管理问题
- ORACLE PL/SQL编程详解之七
- 基于STM32的UCOS和UCGUI对单色屏LCD19264的开发
- 蓝桥杯 - 买不到的数目 (动态规划 + 数论)
- 图像智能字符识别搜集
- 作业、进程、线程