题目描述

给出一张地图,这张地图被分为n×m(n,m<=100)个方块,任何一个方块不是平地就是高山。平地可以通过,高山则不能。现在你处在地图的(x1,y1)这块平地,问:你至少需要拐几个弯才能到达目的地(x2,y2)?你只能沿着水平和垂直方向的平地上行进,拐弯次数就等于行进方向的改变(从水平到垂直或从垂直到水平)的次数。例如:如图,最少的拐弯次数为5。


Solution

这个题想了我一会啊... 所以来记录一下.

想法:

直接从起点开始跑广搜.

但是与传统广搜不同的是,一跑就把那一整行都跑掉,然后全部压入队列中.

然后同时将这一行都打上标记.也就是说这个时候我们的方向是固定的.

具体感受一下代码吧... 我基础是真的弱鸡.


Code

  1. /*
  2. Problem : 1584
  3. Time : Day -95
  4. */
  5. #include<bits/stdc++.h>
  6. using namespace std;
  7. const int dx[]={0,1,0,-1};
  8. const int dy[]={1,0,-1,0};
  9. struct sj{
  10. int x,y,turn;
  11. }s,t,p;
  12. queue<sj> q;
  13. int n,m,c[101][101];
  14. bool v[101][101];
  15. int main()
  16. {
  17. scanf("%d %d",&n,&m);
  18. for(int i=1;i<=n;i++)
  19. for(int j=1;j<=m;j++)
  20. scanf("%d",&c[i][j]);
  21. scanf("%d%d%d%d",&s.x,&s.y,&t.x,&t.y);
  22. q.push(s);
  23. memset(v,0,sizeof(v));
  24. q.front().turn=0;
  25. while(!q.empty())
  26. {
  27. for(int i=0;i<4;i++)
  28. {
  29. p.x=q.front().x+dx[i];
  30. p.y=q.front().y+dy[i];
  31. while(p.x>0&&p.x<=n&&p.y>0&&p.y<=m&&!c[p.x][p.y])
  32. {
  33. if(!v[p.x][p.y])
  34. {
  35. if(p.x==t.x&&p.y==t.y)
  36. {
  37. printf("%d\n",q.front().turn);
  38. return 0;
  39. }
  40. v[p.x][p.y]=1;
  41. p.turn=q.front().turn+1;
  42. //cout<<p.x<<' '<<p.y<<endl;
  43. q.push(p);
  44. }
  45. //cout<<p.x<<' '<<p.y<<endl;
  46. p.x+=dx[i];
  47. p.y+=dy[i];
  48. }
  49. }
  50. q.pop();
  51. }
  52. }

(C++一本通)最少转弯问题 (经典搜索)的更多相关文章

  1. 69.广搜练习:  最少转弯问题(TURN)

    [问题描述] 给出一张地图,这张地图被分为n×m(n,m<=100)个方块,任何一个方块不是平地就是高山.平地可以通过,高山则不能.现在你处在地图的(x1,y1)这块平地,问:你至少需要拐几个弯 ...

  2. 【a802】最少转弯问题

    Time Limit: 10 second Memory Limit: 2 MB 问题描述 给出一张地图,这张地图被分为n*m(n,m<=100)个方块,任何一个方块不是平地就是高山.平地可以通 ...

  3. hdu1495之经典搜索

    非常可乐 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  4. 【bfs】最少转弯问题

    题目描述 给出一张地图,这张地图被分为n×m(n,m<=100)个方块,任何一个方块不是平地就是高山.平地可以通过,高山则不能.现在你处在地图的(x1,y1)这块平地,问:你至少需要拐几个弯才能 ...

  5. hdu 1043(经典搜索)

    题意: 给你一个初始的图,然后每次输入一个图,要求移动x最小的步数达到和初始图一样,输出路径 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 5 6 7 8 5 6 7 8 5 6 7 ...

  6. 棍子Sticks(poj_1011)[经典搜索]

    [题意描述] George用相同的长度棍子,将他们随机切成最多64个单位的长度,现在,他想回到原来的状态,但他忘了他原来的多少根,以及他们原本是多长.请帮助他和设计一个程序,计算最小的可能的原始长度. ...

  7. HDU 2102 A计划 经典搜索

    A计划 Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submissio ...

  8. (中等) HDU 1043 Eight,经典搜索问题。

    Problem Description The 15-puzzle has been around for over 100 years; even if you don't know it by t ...

  9. uva 1601 poj 3523 Morning after holloween 万圣节后的早晨 (经典搜索,双向bfs+预处理优化+状态压缩位运算)

    这题数据大容易TLE 优化:预处理, 可以先枚举出5^3的状态然后判断合不合法,但是由于题目说了有很多墙壁,实际上没有那么多要转移的状态那么可以把底图抽出来,然后3个ghost在上面跑到时候就不必判断 ...

随机推荐

  1. mysql命令行导出导入,附加数据库

    MySQL命令行导出数据库:1,进入MySQL目录下的bin文件夹:cd MySQL中到bin文件夹的目录如我输入的命令行:cd C:\Program Files\MySQL\MySQL Server ...

  2. 2018.5.7 androidStudio中:layout_gravity 与 gravity的属性的区别

    android:gravity:设置的是控件自身上面的内容位置 android:layout_gravity:设置控件本身相对于父控件的显示位置. 看下面 <LinearLayout xmlns ...

  3. opencv中mat的type

    type表示了矩阵中元素的类型以及矩阵的通道个数,它是一系列的预定义的常量,其命名规则为CV_(位数)+(数据类型)+(通道数),由type()返回,但是返回值是int型,不是OpenCV预定义的宏( ...

  4. shell的切换

    从zsh切换到bash:在命令行输入bash即可 从bash切换到zsh:在命令行输入zsh即可

  5. java HashMap 内存泄漏

    import java.util.HashMap; import java.util.Map; public class HashMapOver { public static void main(S ...

  6. springboot 内置tomcat maxPostSizs 无法设置

    ++++++++++++++++++ RT +++++++++++++++++ 如下代码方可解决: /** * tomcat配置类 * 解决post数据体大于2048kb无法接收问题 * 解决tomc ...

  7. IDEA项目显示树形结构

  8. Nginx超时配置

    Nginx超时配置 1.client_header_timeout 语法client_header_timeout time 默认值60s 上下文http server 说明 指定等待client发送 ...

  9. PHP做ERP, CRM, CMS系统需要注意哪些地方

    php作为二次开发弱类型语言, 可读性, 可视度都是比较高的. 在很多人眼里, 也许php只能做一些web应用开发, 比如某个公司的网站, 某个公司的网站后台, 其实,我可以告诉大家, php不比任何 ...

  10. 12.Yii2.0框架视图模版继承与模版相互调用

    目录 模板渲染的两种方式 加载视图 index.php 和 about.php 页面 建立控制器HomeController php 新建模板 home\index.php 新建模板home\abou ...