题意:给出一个起点,一个终点,规定的转弯次数,问能否在规定的转弯次数内到达终点---

这一题是学(看)习(题)的(解)@_@

主要学了两个地方

一个是剪枝,如果搜到的当前点的转弯次数小于该点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】相关推荐

  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的优化)

    这一题,有两个地方需要注意:(除了题目令人窒息的行列的x y设置) ①转弯如何判断? 需要给转弯的方向赋值.通常,我们在节点向四个方向延伸的时候,喜欢这样 int nextx[4]={0,0,-1,1 ...

  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. vue.js官方文档 PDF
  2. 【Avalon】绑定块(监听器):管理每一个绑定
  3. 搭建SpringBoot服务器,在公司内网中使用
  4. 上交大计算机复试机师难不难,本科复旦,考研上海交大复试第一,我感觉难度并不大...
  5. cad怎么设置线的粗细_CAD软件中怎么设置CAD线宽?
  6. docker jfrog-oss
  7. 书屋(一):读《世界是平的》有感
  8. 10款让你心动的 HTML5 CSS3 效果
  9. 李开复写给大学生的第四封信的一些笔录
  10. 【编程好习惯】使用sizeof减少内存操作失误
  11. 【译】Matplotlib:plotting
  12. 康威生命游戏-蓝桥杯java
  13. 在阿里云上搭建私有GIT仓库
  14. ps切出来的图片导出来只有一张是png格式的其他全是jpg格式,怎么样让所有的切片变成png格式。
  15. 网络设备的连接以及配置
  16. 苹果cmsv10好看的七色中文二开视频免费模板
  17. 反软件盗版的最佳实践
  18. python django及运维开发面试题总结
  19. 众昂矿业:萤石矿产战略价值日益突出
  20. 论文阅读:Saliency-Guided Region Proposal Network for CNN Based Object Detection

热门文章

  1. jquery点击缩略图切换视频播放的视频切换焦点图效果
  2. 微信公众平台开发(44)历史上的今天
  3. 6.6 rsync:文件同步工具
  4. java巴特沃斯滤波器编程_巴特沃斯(Butterworth)滤波器 (1)
  5. centos安装时卡住不动_转子流量计转子或指针停在某一位置不动的原因及处理方法...
  6. virtualbox 创建桥接网络_VirtualBox 桥接上网方式的配置
  7. Linux 中的文件传输
  8. 新时代大视频产业的底座,视频云创变了什么?
  9. 怎样避免每次都解释大量指令?
  10. 飞天大数据平台助力轻松筹数字化运营