今天开始了新一章的学习,前面的题目虽然做了几道,但是我觉得训练量仍然太小了。不过机试确实很多题目,并且难度也有所不同,所以要针对不同的题目进行专门的练习才好。题目类型有些多,等接下来我将搜索的题目写完后整体练习一下图论和搜索的题目,对其有个更好的理解之后再进行动态规划和贪心算法的题目。

今天记录一下广度搜索的内容,这里根据一道题目具体的去分析广度搜索的写法与思路。

Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会.

魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩阵,刚开始Ignatius被关在(0,0,0)的位置,离开城堡的门在(A-1,B-1,C-1)的位置,现在知道魔王将在T分钟后回到城堡,Ignatius每分钟能从一个坐标走到相邻的六个坐标中的其中一个.现在给你城堡的地图,请你计算出Ignatius能否在魔王回来前离开城堡(只要走到出口就算离开城堡,如果走到出口的时候魔王刚好回来也算逃亡成功),如果可以请输出需要多少分钟才能离开,如果不能则输出-1.

输入数据的第一行是一个正整数K,表明测试数据的数量.每组测试数据的第一行是四个正整数A,B,C和T(1<=A,B,C<=50,1<=T<=1000),它们分别代表城堡的大小和魔王回来的时间.然后是A块输入数据(先是第0块,然后是第1块,第2块......),每块输入数据有B行,每行有C个正整数,代表迷宫的布局,其中0代表路,1代表墙.(如果对输入描述不清楚,可以参考Sample Input中的迷宫描述,它表示的就是上图中的迷宫)

特别注意:本题的测试数据非常大,请使用scanf输入,我不能保证使用cin能不超时.在本OJ上请使用Visual C++提交.

对于每组测试数据,如果Ignatius能够在魔王回来前离开城堡,那么请输出他最少需要多少分钟,否则输出-1.

Sample Input
1
3 3 4 20
0 1 1 1
0 0 1 1
0 1 1 1
1 1 1 1
1 0 0 1
0 1 1 1
0 0 0 0
0 1 1 0
0 1 1 0 Sample Output
11

这道题目就是很好的广度搜索题目,在此我将思路记录下来并方便以后查阅。

下面放上AC代码:

#include "stdio.h"
#include "iostream"
#include "queue"
using namespace std;
bool mark[][][];
int maze[][][];
struct N{
int x,y,z;
int t;
};
queue<N> Q;
int go[][]={
,,,
-,,,
,,,
,-,,
,,,
,,-
}; int BFS(int x,int y,int z){
while (!Q.empty()){
N now = Q.front();
Q.pop();
for (int i = ; i < ; ++i) {
int nx = now.x + go[i][];
int ny = now.y + go[i][];
int nz = now.z + go[i][];
if(nx< || ny < || nz< ||nx>=x || ny>=y || nz>= z) continue;
if(maze[nx][ny][nz]==) continue;
if(mark[nx][ny][nz]) continue;
N tmp;
tmp.x = nx;
tmp.y = ny;
tmp.z = nz;
tmp.t = now.t + ;
Q.push(tmp);
mark[nx][ny][nz] = true;
if(nx==x- && ny == y- && nz==z-){ return tmp.t;}
}
}
return -;
} int main(){
int n;
cin>>n;
while (n--){
int x,y,z,t;
cin>>x>>y>>z>>t;
for (int i = ; i < x; ++i) {
for (int j = ; j < y; ++j) {
for (int k = ; k < z; ++k) {
scanf("%d",&maze[i][j][k]);
mark[i][j][k] = false;
}
}
} while(!Q.empty()) Q.pop();
mark[][][] = true;
N tmp;
tmp.x=tmp.y=tmp.z=tmp.t = ;
Q.push(tmp);
int fin = BFS(x,y,z);
if(fin<=t) cout<<fin<<endl;
else cout<<-<<endl;
}
return ;
}

简单说明下代码,广度搜索的思想就是将起始点看做根,终点看做我们的一个树的叶子结点,只有到达了这个叶子结点我们才能得到解。

而广度搜索的意思就是一层一层遍历,每一层遍历结束后才可以进入下一层。

代码中,为了找到出口(x-1,y-y,z-1),我们要遍历每个点并且找到用步最少的方案。而每个父节点可以延伸最多6个子节点(其中会有重复的点),所以这个搜索空间是非常非常大的。所以此时我们就可以使用剪枝的思想,我们知道,迷宫中的每个点其实都是可以被多次访问的,但是并不是每次访问的方法都是最优解。但是我们知道,如果使用广度搜索第一次访问到的点所走的路径一定就会是离起始点最近的路径。由上叙知识我们就可以得到,既然我们起点相同,那么中间的点为何不取最小的路径?所以我们就可以使用广度搜索,把每个点的最短路都找出来,并从当前最短路的点开始延伸。

代码中定义了队列Q,用来进行出对入队。走横向扫描。使用了三个continue来做剪枝

算法学习--Day10的更多相关文章

  1. DSP算法学习-过采样技术

    DSP算法学习-过采样技术 彭会锋 2015-04-27 23:23:47 参考论文: 1 http://wr.lib.tsinghua.edu.cn/sites/default/files/1207 ...

  2. 算法学习之C语言基础

    算法学习,先熟悉一下C语言哈!!! #include <conio.h> #include<stdio.h> int main(){ printf(+); getch(); ; ...

  3. Python之路,Day21 - 常用算法学习

    Python之路,Day21 - 常用算法学习   本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的 ...

  4. C / C++算法学习笔记(8)-SHELL排序

    原始地址:C / C++算法学习笔记(8)-SHELL排序 基本思想 先取一个小于n的整数d1作为第一个增量(gap),把文件的全部记录分成d1个组.所有距离为dl的倍数的记录放在同一个组中.先在各组 ...

  5. 算法学习之BFS、DFS入门

    算法学习之BFS.DFS入门 0x1 问题描述 迷宫的最短路径 给定一个大小为N*M的迷宫.迷宫由通道和墙壁组成,每一步可以向相邻的上下左右四格的通道移动.请求出从起点到终点所需的最小步数.如果不能到 ...

  6. 二次剩余Cipolla算法学习笔记

    对于同余式 \[x^2 \equiv n \pmod p\] 若对于给定的\(n, P\),存在\(x\)满足上面的式子,则乘\(n\)在模\(p\)意义下是二次剩余,否则为非二次剩余 我们需要计算的 ...

  7. Manacher算法学习笔记 | LeetCode#5

    Manacher算法学习笔记 DECLARATION 引用来源:https://www.cnblogs.com/grandyang/p/4475985.html CONTENT 用途:寻找一个字符串的 ...

  8. 第四百一十五节,python常用排序算法学习

    第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...

  9. PCA算法学习(Matlab实现)

    PCA(主成分分析)算法,主要用于数据降维,保留了数据集中对方差贡献最大的若干个特征来达到简化数据集的目的. 实现数据降维的步骤: 1.将原始数据中的每一个样本用向量表示,把所有样本组合起来构成一个矩 ...

随机推荐

  1. Python 007- python的各种函数

    1.chr().unichr()和ord() chr()函数用一个范围在range(256)内的(就是0-255)整数作参数,返回一个对应的字符. unichr()跟它一样,只不过返回的是Unicod ...

  2. Hadoop实战-Flume之Source interceptor(十一)(2017-05-16 22:40)

    a1.sources = r1 a1.sinks = k1 a1.channels = c1 # Describe/configure the source a1.sources.r1.type = ...

  3. 转载-jmeter进阶功能

    在这此对新版本jmeter的学习+温习的过程,发现了一些以前不知道的功能,所以,整理出来与大分享.本文内容如下. 如何使用英文界面的jmeter 如何使用镜像服务器 Jmeter分布式测试 启动Deb ...

  4. linux-unzip命令【转载】

    前辈 总结的很好http://www.cnblogs.com/lucyjiayou/archive/2011/12/25/2301046.html 功能说明:压缩文件. 语 法:zip [-AcdDf ...

  5. mysql学习笔记(七)—— MySQL内连接和外连接

        MySQL内连接(inner join on) MySQL的内连接使用inner join on,它的效果跟使用where是一样的,如果联结的是两个表,那么需要左右的条件或者说字段是需要完全匹 ...

  6. iOS 使用.xcworkspace文件管理代码和工程依赖(实现项目模块化)

    一.创建xcworkspace文件. 在cocoapods安装后,项目文件里都会多一个后缀为.xcworkspace的文件.打开这个文件就相当打开最初创建的项目了.那么这个文件也就是用来管理项目的,它 ...

  7. phpcms v9中的$CATEGORYS栏目数组

    首先 如果不能用$CATEGORYS这个数组或掉不出来内容应加入 $CATEGORYS = getcache('category_content_1','commons'); 1.用途 $CATEGO ...

  8. html5--3.18 新增的output元素

    html5--3.18 新增的output元素 学习要点 了解output元素的用法 output元素:数据的输出 output元素是HTML5新增的元素,用来设置不同数据的输出 output元素的输 ...

  9. js事件传播的一个疑惑

    在学习事件传播的时候,发现一个问题,当时是这样子的. 我给多层元素分别绑定了冒泡和捕获事件.按道理应该先从外向内执行完所有的捕获事件,再由内向外执行所有的冒泡事件. 但是天不随人愿啊,有个元素偏偏先执 ...

  10. 使用MongoDB.NET 2.2.4驱动版本对 Mongodb3.3数据库中GridFS增删改查

    Program.cs代码如下: internal class Program { private static void Main(string[] args) { GridFSHelper help ...