搜索4--noi6264:走出迷宫

一、心得

可以去看看别人的代码,吸收精华

二、题目

6264:走出迷宫

总时间限制: 
1000ms

内存限制: 
65536kB
描述

当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。 
假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路。

输入
第一行是两个整数n和m(1<=n,m<=100),表示迷宫的行数和列数。
接下来n行,每行一个长为m的字符串,表示整个迷宫的布局。字符'.'表示空地,'#'表示墙,'S'表示起点,'T'表示出口。
输出
输出从起点到出口最少需要走的步数。
样例输入
  1. 3 3
  2. S#T
  3. .#.
  4. ...
样例输出
  1. 6

三、分析

典型的BFS

四、AC代码

  1. //6264:走出迷宫
  2. #include <iostream>
  3. #include <queue>
  4. using namespace std;
  5. //n表示行,m表示列
  6. int n,m;
  7. //上右下左
  8. int runRow[]={,,-,};
  9. int runColumn[]={,,,-};
  10. //迷宫
  11. char maze[][];
  12. //起点和终点
  13. int startR,startC,endR,endC;
  14. //描述点的结构体
  15. struct node{
  16. int row;//行
  17. int column;//列
  18. int minStep;//到每个点的最短步数
  19. };
  20. //每个点是否被访问
  21. bool vis[][];
  22.  
  23. queue<node> mazeQueue;
  24.  
  25. void readData(){
  26. cin>>n>>m;
  27. for(int i=;i<=n;i++){
  28. for(int j=;j<=m;j++){
  29. cin>>maze[i][j];
  30. //找到起点和终点
  31. if(maze[i][j]=='S'){
  32. startR=i;
  33. startC=j;
  34. }else if(maze[i][j]=='T'){
  35. endR=i;
  36. endC=j;
  37. }
  38. }
  39. }
  40. }
  41.  
  42. void printMaze(){
  43. for(int i=;i<=n;i++){
  44. for(int j=;j<=m;j++){
  45. cout<<maze[i][j]<<" ";
  46. }
  47. cout<<endl;
  48. }
  49. cout<<"start:"<<startR<<"."<<startC<<endl;
  50. cout<<"end:"<<endR<<"."<<endC<<endl;
  51. }
  52.  
  53. void search(int startR,int startC){
  54. node *p=new node;
  55. //设置起点
  56. p->row=startR;
  57. p->column=startC;
  58. p->minStep=;
  59. //把起点添加至队列
  60. mazeQueue.push(*p);
  61. vis[startR][startC]=true;
  62. //访问所有点的可能情况
  63.  
  64. while(!mazeQueue.empty()){
  65. node q=mazeQueue.front();
  66. mazeQueue.pop();
  67. // cout<<"node: "<<q.row<<" "<<q.column<<" "<<q.minStep<<endl;
  68. // cout<<"------------------------------------------------"<<endl;
  69. // cout<<"q.row: "<<q.row<<"q.column: "<<q.column<<endl;
  70. // cout<<"endR: "<<endR<<"endC: "<<endC<<endl;
  71. // cout<<"------------------------------------------------"<<endl;
  72. if(q.row==endR&&q.column==endC){
  73. cout<<q.minStep<<endl;
  74. break;
  75. }else{
  76. for(int i=;i<=;i++){
  77. int row1=q.row+runRow[i];
  78. int column1=q.column+runColumn[i];
  79.  
  80. if(row1>=&&row1<=n&&column1>=&&column1<=m&&(maze[row1][column1]=='.'||maze[row1][column1]=='T')&&!vis[row1][column1]){
  81. // cout<<"row1: "<<row1<<"column1: "<<column1<<endl;
  82. vis[row1][column1]=true;
  83. node *p1=new node;
  84. p1->row=row1;
  85. p1->column=column1;
  86. p1->minStep=q.minStep+;
  87. mazeQueue.push(*p1);
  88. }
  89. }
  90. }
  91.  
  92. }
  93.  
  94. }
  95.  
  96. int main(){
  97. //freopen("in.txt","r",stdin);
  98. readData();
  99. search(startR,startC);
  100. //printMaze();
  101. return ;
  102. }

五、注意点

1、迷宫中不只为'.'的可以走,为‘T’的也可以走

2、基于第一点,所以可以优化代码,所有按照能不能走来来标识为true或者false

这样的话就只需要vis数组,而不需要maze数组,这样即简单而且不容易错,

这里就步演示了

搜索4--noi6264:走出迷宫的更多相关文章

  1. 一本通之 一堆迷宫 (Dungeon Master&走出迷宫&走迷宫)

    一本通在线崩溃....... . 有图有真相 这是个三维迷宫,其实和二位迷宫差不多,只是方向多加了2个. 但这个题的输入十分恶心,一度被坑的用cin.ignore(),但还是不过... 它的正确输入方 ...

  2. C语言(简单游戏)-走出迷宫

    #include <stdio.h> //宏定义 maze[ROWS][COLS];行和列; #define ROWS 7 #define COLS 6 //绘制迷宫(全局变量) char ...

  3. Openjudge 2.5 6264:走出迷宫

    总时间限制:  1000ms 内存限制:  65536kB 描述 当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单. 假设你已经得到了一个n* ...

  4. 走出MFC子类化的迷宫

    走出MFC子类化的迷宫 KEY WORDS:子类化 SUBCLASSWINDOW  MFC消息机制 许多Windows程序员都是跳过SDK直接进行RAD开发工具[或VC,我想VC应不属于RAD]的学习 ...

  5. 【洛谷】【搜索(dfs)】P1363 幻想迷宫

    [题目描述:] 幻象迷宫可以认为是无限大的,不过它由若干个N*M的矩阵重复组成.矩阵中有的地方是道路,用'.'表示:有的地方是墙,用'#'表示.LHX和WD所在的位置用'S'表示.也就是对于迷宫中的一 ...

  6. ofo走出校园观察:市场定位导致产品错位?

    Ofo和摩拜单车虽然同样都是做单车共享,但实际上两者在最初的市场定位是有明显的差异的,因此提供的产品方案也存在巨大的差异. 市场定位不同,导致产品方案的巨大差异 摩拜单车一开始就定位于开放市场,充分的 ...

  7. 为什么DIY报价----走出软件作坊:三五个人十来条枪 如何成为开发正规军(十二)[转]

    前段时间,写了一个开发.实施.服务费用计算三部曲. 水清则无鱼--走出软件作坊:三五个人十来条枪 如何成为开发正规军(八) 实施费用也能DIY--走出软件作坊:三五个人十来条枪 如何成为开发正规军(九 ...

  8. 将服务费用DIY到底----走出软件作坊:三五个人十来条枪 如何成为开发正规军(十)[转]

    前一段时间,讲了一系列开发经理.实施经理.服务经理的工具箱:开发经理的工具箱---走出软件作坊:三五个人十来条枪 如何成为开发正规军(三) ,实施经理的工具箱--走出软件作坊:三五个人十来条枪 如何成 ...

  9. 走出测试,走向CEO

    飞测说:大家好,我们又见面了,我是黑夜小怪.不巧,今晚加班回来路上,湿身了,淋了个落汤鸡,不过明天也许可以看海了,也就呵呵了,原本想回来后聊些技术的,现在突然想先聊聊我的一些想法,仅供交流. 走出测试 ...

随机推荐

  1. Kuratowski's and Wagner's theorems

    w https://en.wikipedia.org/wiki/Planar_graph The Polish mathematician Kazimierz Kuratowski provided ...

  2. ThreadLocal (二):什么时候使用 InheritableThreadLocal

    一.ThreadLocal 在父子线程传递的问题 public class InheritableThreadLocalDemo { // 全局变量 // static ThreadLocal< ...

  3. Linux中的grep和cut

    提取行: grep --color  着色 -v         不包含 提取列: cut -f      列号 提取第几列 -d     分隔符 以什么为分隔符,默认是制表键 局限性:如果分隔符不那 ...

  4. windows 安装 python _ flask

    1:首先安装python虚拟环境;(略) 2: 添加一个虚拟环境: 在你的项目目录里直接 virtualenv venv 启动虚拟环境;\venv\Scripts 直接运行activate 3: 在虚 ...

  5. 5 Best VPNs for Ubuntu

    https://www.bestvpn.com/blog/6268/5-best-vpns-for-ubuntu/?nabe=6412130213429248:0&utm_referrer=h ...

  6. ZFIR_001 ole下载

    *&---------------------------------------------------------------------** Report ZFIR_001* Appli ...

  7. python学习之路-第二天-常见的注意事项(代码风格、运算符、优先级、控制语句)

    总结了今天学习几个注意事项: 对代码声明变量的时候没必要像以前写java或者c代码要声明数据类型,只需要赋值即可 代码一行基本只写一句逻辑行,而且尽量不在python里面写':' 明确的行连接'',暗 ...

  8. Python traps and pitfalls

    @1: >>> def func(a, L=[]): ... L.append(a) ... print(L) ... >>> func(10) [10] > ...

  9. C#对Excel中指定一列或一行实现隐藏或显示!

    C#对Excel中指定一列或一行实现隐藏或显示!不会,求指导!

  10. 财经世界(2)A股B股和H股

    在发行过程中,公司通过章程给不同股份形式赋予不同的权益,使公司股份出现A股.B股等形式.我国上市公司的股票有A股.B股.H股.N股.S股等的区分.这一区分的主要依据股票的上市地点和所面对的投资者而定. ...