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

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

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. 第 1 章 第 1 题 高级语言的排序问题 C++标准算法实现

    问题分析 依题意,所需程序不用过多考虑效率且暗示使用库,自然想到用高级语言实现(个人选择C++).可用顺序容器暂存数据,用标准算法解决排序问题. 代码实现 #include <iostream& ...

  2. WPF3.5 使用BINDINGGROUP进行实体类和集合验证

    前文介绍了自定义或系统自带的ValidationRule进行验证,这种方法对于单个元素的验证不错.很多时候,我们需要对表单(Form)进行验证,也就是对一个实体类进行验证,或者对一个集合的每项进行验证 ...

  3. n&(n-1)的妙用

    今天无聊拿起<编程之美>看了下,发现原来n&(n-1)还有很多妙用.n&(n-1)作用:将n的二进制表示中的最低位为1的改为0,先看一个简单的例子:n = 10100(二进 ...

  4. JS/PHP字符串截取

    <script> var str="首都医科大学附属北京同仁医院-156"; var index = str.indexOf('-');//获取-的索引值,从0开始算, ...

  5. quick-cocos2d-x开发工具sublime text及其强力插件QuickXDev

    更新:如今QuickXDev已经能够通过Package Control下载了,全部QuickXDev相关的请看这里:http://my.oschina.net/lonewolf/blog?catalo ...

  6. EasyHLS直播在Linux非root用户运行时出现无法写文件的问题解决mkdir 0777

    今天在Github上收到一个用户反馈的EasyHLS在linux上非root用户调用时,无法写目录的问题:https://github.com/EasyDarwin/EasyHLS/issues/3, ...

  7. python中的类的成员变量以及property函数

    1 python类的各种变量 1.1 全局变量 在类外定义的变量. 1.2 类变量 定义在类里面,所有的函数外面的变量.这个变量只有一份,是所有的对象共有的.在类外用“类.”来引用. 1.3 实例变量 ...

  8. python网络爬虫之使用scrapy下载文件

    前面介绍了ImagesPipeline用于下载图片,Scrapy还提供了FilesPipeline用与文件下载.和之前的ImagesPipeline一样,FilesPipeline使用时只需要通过it ...

  9. HDU5950 Recursive sequence —— 矩阵快速幂

    题目链接:https://vjudge.net/problem/HDU-5950 Recursive sequence Time Limit: 2000/1000 MS (Java/Others)   ...

  10. ansible-playbook初始化服务器

    hosts ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ [test] 0.0.0.0 ansible_ssh_us ...