搜索4--noi6264:走出迷宫

一、心得

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

二、题目

6264:走出迷宫

总时间限制: 
1000ms

内存限制: 
65536kB
描述

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

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

三、分析

典型的BFS

四、AC代码

 //6264:走出迷宫
#include <iostream>
#include <queue>
using namespace std;
//n表示行,m表示列
int n,m;
//上右下左
int runRow[]={,,-,};
int runColumn[]={,,,-};
//迷宫
char maze[][];
//起点和终点
int startR,startC,endR,endC;
//描述点的结构体
struct node{
int row;//行
int column;//列
int minStep;//到每个点的最短步数
};
//每个点是否被访问
bool vis[][]; queue<node> mazeQueue; void readData(){
cin>>n>>m;
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
cin>>maze[i][j];
//找到起点和终点
if(maze[i][j]=='S'){
startR=i;
startC=j;
}else if(maze[i][j]=='T'){
endR=i;
endC=j;
}
}
}
} void printMaze(){
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
cout<<maze[i][j]<<" ";
}
cout<<endl;
}
cout<<"start:"<<startR<<"."<<startC<<endl;
cout<<"end:"<<endR<<"."<<endC<<endl;
} void search(int startR,int startC){
node *p=new node;
//设置起点
p->row=startR;
p->column=startC;
p->minStep=;
//把起点添加至队列
mazeQueue.push(*p);
vis[startR][startC]=true;
//访问所有点的可能情况 while(!mazeQueue.empty()){
node q=mazeQueue.front();
mazeQueue.pop();
// cout<<"node: "<<q.row<<" "<<q.column<<" "<<q.minStep<<endl;
// cout<<"------------------------------------------------"<<endl;
// cout<<"q.row: "<<q.row<<"q.column: "<<q.column<<endl;
// cout<<"endR: "<<endR<<"endC: "<<endC<<endl;
// cout<<"------------------------------------------------"<<endl;
if(q.row==endR&&q.column==endC){
cout<<q.minStep<<endl;
break;
}else{
for(int i=;i<=;i++){
int row1=q.row+runRow[i];
int column1=q.column+runColumn[i]; if(row1>=&&row1<=n&&column1>=&&column1<=m&&(maze[row1][column1]=='.'||maze[row1][column1]=='T')&&!vis[row1][column1]){
// cout<<"row1: "<<row1<<"column1: "<<column1<<endl;
vis[row1][column1]=true;
node *p1=new node;
p1->row=row1;
p1->column=column1;
p1->minStep=q.minStep+;
mazeQueue.push(*p1);
}
}
} } } int main(){
//freopen("in.txt","r",stdin);
readData();
search(startR,startC);
//printMaze();
return ;
}

五、注意点

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. Nginx服务监听端口修改启动bug

    监听的端口从80 修改到其他端口出现启动不起来问题. 解决方案如下: yum install policycoreutils-python sudo cat /var/log/audit/audit. ...

  2. iOS 横竖屏适配

    关于横竖屏适配 也没做过,今天读别人的源码,遇到了.为了了解清楚,就系统的学习一下. 一 横竖屏方向枚举 关于横竖屏一共有三种枚举 UIInterfaceOrientation UIInterface ...

  3. 从“关于Java堆与栈的思考”一帖看错误信息的传播

    我对转贴的信息一直有敌意,原因如下:首先,除了制造更多的信息垃圾,转贴不会带来新的价值,想收藏的话一个链接足矣:其次,将错误信息以讹传讹,混淆视听.不妨选一个典型的例子说明一二. 相信<关于Ja ...

  4. Facebook内部高效工作PPT指南(转)

    add by zhj: 其实好几条说的是“时间管理四象限”,如下图.对于自己来说,需要做的是两类事:重要且紧急,重要但不紧急. 第一类事情要立即去做:第二类事情,往往是花时间比较多的,比如锻炼身体,维 ...

  5. Wicket:一种构建和测试动态 Web 页面的简化框架

    https://www.ibm.com/developerworks/cn/web/wa-aj-wicket/

  6. Android 开发之:Intent.createChooser() 妙用

    大家对该功能第一印象就是ApiDemo 里面的 其只有区区几行代码  提取为: Intent intent = new Intent(Intent.ACTION_GET_CONTENT); inten ...

  7. Linux服务器维护常用命令

    # uname -a # 查看内核/操作系统/CPU信息 # /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # hostname # 查看计算 ...

  8. C#(ASP.NET)隐藏或显示Excel中指定列

    今天写的一个方法,实现Excel指定列的隐藏和显示: 环境:VS2010,OFFICE 2010 代码:#region 隐藏和显示Excel中的一列        /// <summary> ...

  9. Android Http Get Post

    public class MyHttpUrlCon { public static String settionId = ""; ;// public ReturnData doG ...

  10. ZOJ 3959 Problem Preparation 【水】

    题目链接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3959 AC代码 #include <cstdio> ...