HDU 1728 逃离迷宫【BFS】
题意:给出一个起点,一个终点,规定的转弯次数,问能否在规定的转弯次数内到达终点---
这一题是学(看)习(题)的(解)@_@
主要学了两个地方
一个是剪枝,如果搜到的当前点的转弯次数小于该点turn数组记录下来的转弯次数,才有必要将它加入队列。
另一个是记录转弯方向 在结构体里面定义一个turn来记录转弯的个数,用dir来记录当前所在的方向(因为搜的时候是四个方向dir[4][2]来搜的,直接用i确定当前方向即可)
想想自己第一次做的时候的doubi想法,用dfs做,然后dfs(x,y,px,py),再判断由(x+dir[i][0],y+dir[i][1])与(x,y)构成的直线斜率和(x,y)和(px,py)构成的斜率乘积是否为-1-----果断没有写对----
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 using namespace std; 7 int turn[105][105]; 8 int n,m,k; 9 int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; 10 char map[105][105]; 11 struct node 12 { 13 int x,y; 14 int turn,dir;//用turn来记录转弯的个数,用dir来记录当前的方向 15 } st,en,now,next; 16 queue<node>q; 17 void bfs() 18 { 19 while(!q.empty()) q.pop(); 20 now.x=st.x;now.y=st.y;now.dir=-5;now.turn=0;//初始的方向可以定义为任意一个后来不会出现的方向 21 turn[now.x][now.y]=0; //在起点时可以转向任意方向,令为0 22 q.push(now); 23 while(!q.empty()) 24 { 25 now=q.front();q.pop(); 26 27 for(int i=0;i<4;i++) 28 { 29 next.x=now.x+dir[i][0]; 30 next.y=now.y+dir[i][1]; 31 next.dir=now.dir; 32 next.turn=now.turn; 33 if(now.x==en.x&&now.y==en.y&&now.turn<=k) 34 { 35 printf("yes\n"); 36 return; 37 } 38 if(next.x<1||next.x>m||next.y<1||next.y>n||map[next.x][next.y]=='*') continue;//第一次剪枝 39 if(next.dir!=i&&next.dir!=-5) //如果当前方向和起始不同,则turn++ 40 next.turn++; 41 if(next.turn>k) continue;//第二次剪 枝,转弯次数超过了,则剪枝 42 if(next.x==en.x&&next.y==en.y&&next.turn<=k) 43 { 44 printf("yes\n"); 45 return; 46 } 47 48 if(next.turn<=turn[next.x][next.y])//第三次剪枝,如果当前转弯的个数小于当前点的转弯个数,才有继续搜索的必要 49 { 50 next.dir=i; 51 turn[next.x][next.y]=next.turn; 52 q.push(next); 53 } 54 } 55 } 56 printf("no\n"); 57 return; 58 } 59 int main() 60 { 61 int ncase,i,j; 62 scanf("%d",&ncase); 63 while(ncase--) 64 { 65 scanf("%d %d",&m,&n); 66 for(i=1;i<=m;i++) 67 for(j=1;j<=n;j++) 68 { 69 cin>>map[i][j]; 70 turn[i][j]=1000000;//初始化 每一点的转弯个数为一个极大的值 71 } 72 cin>>k>>st.y>>st.x>>en.y>>en.x; 73 bfs(); 74 } 75 }
View Code
转载于:https://www.cnblogs.com/wuyuewoniu/p/4295746.html
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的优化)
这一题,有两个地方需要注意:(除了题目令人窒息的行列的x y设置) ①转弯如何判断? 需要给转弯的方向赋值.通常,我们在节点向四个方向延伸的时候,喜欢这样 int nextx[4]={0,0,-1,1 ...
- 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 ...
最新文章
- vue.js官方文档 PDF
- 【Avalon】绑定块(监听器):管理每一个绑定
- 搭建SpringBoot服务器,在公司内网中使用
- 上交大计算机复试机师难不难,本科复旦,考研上海交大复试第一,我感觉难度并不大...
- cad怎么设置线的粗细_CAD软件中怎么设置CAD线宽?
- docker jfrog-oss
- 书屋(一):读《世界是平的》有感
- 10款让你心动的 HTML5 CSS3 效果
- 李开复写给大学生的第四封信的一些笔录
- 【编程好习惯】使用sizeof减少内存操作失误
- 【译】Matplotlib:plotting
- 康威生命游戏-蓝桥杯java
- 在阿里云上搭建私有GIT仓库
- ps切出来的图片导出来只有一张是png格式的其他全是jpg格式,怎么样让所有的切片变成png格式。
- 网络设备的连接以及配置
- 苹果cmsv10好看的七色中文二开视频免费模板
- 反软件盗版的最佳实践
- python django及运维开发面试题总结
- 众昂矿业:萤石矿产战略价值日益突出
- 论文阅读:Saliency-Guided Region Proposal Network for CNN Based Object Detection
热门文章
- jquery点击缩略图切换视频播放的视频切换焦点图效果
- 微信公众平台开发(44)历史上的今天
- 6.6 rsync:文件同步工具
- java巴特沃斯滤波器编程_巴特沃斯(Butterworth)滤波器 (1)
- centos安装时卡住不动_转子流量计转子或指针停在某一位置不动的原因及处理方法...
- virtualbox 创建桥接网络_VirtualBox 桥接上网方式的配置
- Linux 中的文件传输
- 新时代大视频产业的底座,视频云创变了什么?
- 怎样避免每次都解释大量指令?
- 飞天大数据平台助力轻松筹数字化运营