算法学习--Day10
今天开始了新一章的学习,前面的题目虽然做了几道,但是我觉得训练量仍然太小了。不过机试确实很多题目,并且难度也有所不同,所以要针对不同的题目进行专门的练习才好。题目类型有些多,等接下来我将搜索的题目写完后整体练习一下图论和搜索的题目,对其有个更好的理解之后再进行动态规划和贪心算法的题目。
今天记录一下广度搜索的内容,这里根据一道题目具体的去分析广度搜索的写法与思路。
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的更多相关文章
- DSP算法学习-过采样技术
DSP算法学习-过采样技术 彭会锋 2015-04-27 23:23:47 参考论文: 1 http://wr.lib.tsinghua.edu.cn/sites/default/files/1207 ...
- 算法学习之C语言基础
算法学习,先熟悉一下C语言哈!!! #include <conio.h> #include<stdio.h> int main(){ printf(+); getch(); ; ...
- Python之路,Day21 - 常用算法学习
Python之路,Day21 - 常用算法学习 本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的 ...
- C / C++算法学习笔记(8)-SHELL排序
原始地址:C / C++算法学习笔记(8)-SHELL排序 基本思想 先取一个小于n的整数d1作为第一个增量(gap),把文件的全部记录分成d1个组.所有距离为dl的倍数的记录放在同一个组中.先在各组 ...
- 算法学习之BFS、DFS入门
算法学习之BFS.DFS入门 0x1 问题描述 迷宫的最短路径 给定一个大小为N*M的迷宫.迷宫由通道和墙壁组成,每一步可以向相邻的上下左右四格的通道移动.请求出从起点到终点所需的最小步数.如果不能到 ...
- 二次剩余Cipolla算法学习笔记
对于同余式 \[x^2 \equiv n \pmod p\] 若对于给定的\(n, P\),存在\(x\)满足上面的式子,则乘\(n\)在模\(p\)意义下是二次剩余,否则为非二次剩余 我们需要计算的 ...
- Manacher算法学习笔记 | LeetCode#5
Manacher算法学习笔记 DECLARATION 引用来源:https://www.cnblogs.com/grandyang/p/4475985.html CONTENT 用途:寻找一个字符串的 ...
- 第四百一十五节,python常用排序算法学习
第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...
- PCA算法学习(Matlab实现)
PCA(主成分分析)算法,主要用于数据降维,保留了数据集中对方差贡献最大的若干个特征来达到简化数据集的目的. 实现数据降维的步骤: 1.将原始数据中的每一个样本用向量表示,把所有样本组合起来构成一个矩 ...
随机推荐
- windows常用快捷键(转载)
f1 显示当前程序或者windows的帮助内容. f2 当你选中一个文件的话,这意味着“重命名” f3 当你在桌面上的时候是打开“查找:所有文件” 对话框 f10或alt 激活当前程序的菜单栏 win ...
- WPF学习专题
http://developer.51cto.com/art/200809/88207.htm
- 在VC++空工程中使用MFC类,采用Unicode字符集后,运行工程程序报错的解决方案
创建一个VC++空工程,将Project Properties->General->Use of MFC改为Use MFC in a Shared DLL 新建一个源文件,内容如下 #in ...
- Oracle rac 配置Weblogic数据源时 实例名及URL的选择
Oracle 10G 是 RAC 的,即有两个节点.两个节点 IP及实例名分别为:10.1.43.11 stnic110.1.43.21 stnic2配置数据源时 一直使用的是第一个 URL 及 实例 ...
- Dockerfile指令:
Dockerfile指令: 第一行注释,指令是大写字母开头, FROM指令: FROM<image>,后面跟镜像名, FROM<image>:<tag>,后面跟镜像 ...
- jmeter测试总结
一次性能测试的总结 相关推荐:Apusic应用服务器的性能调节_JVM优化 Apusic应用服务器作为企业应用的运行平台,系统的性能非常重要.当应用对性能的要求比较苛刻时,就要考虑是否需要改变系统的缺 ...
- Android系统shell中的clear命令实现【转】
本文转载自:http://blog.csdn.net/morixinguan/article/details/73467845 之前一直不太清楚,当我们在shell命令行输入很多命令,会在屏幕上输出一 ...
- sdut oj 3058 路线冲突问题(BFS+记录路径算法,回溯路径 )
路线冲突问题 题目描述 给出一张地图,地图上有n个点,任意两点之间有且仅有一条路.点的编号从1到n. 现在兵团A要从s1到e1,兵团B要从s2到e2,问两条路线是否会有交点,若有则输出交点个数,否出输 ...
- CodeForces - 385E Bear in the Field —— 矩阵快速幂
题目链接:https://vjudge.net/problem/CodeForces-385E E. Bear in the Field time limit per test 1 second me ...
- Struts2基础知识
1.什么是Struts2框架? 答:struts2是一款优秀的mvc框架,集中解决了Controlller的相关问题,解决了部分视图相关的问题(struts2标签): mvc 是一种思想,包括Mode ...