算法学习--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.将原始数据中的每一个样本用向量表示,把所有样本组合起来构成一个矩 ...
随机推荐
- Xcode5.1.1+ios 7.1.2 免证书真机调试
Xcode假设不破解.无法真机调试, 也无法编译真机Release文件.仅仅有付费开通Apple开发人员账号,才干申请真机调试.而Xcode进行破解后,结合越狱的iPhone或iPad, 就可以免官方 ...
- 网站web.cofig配置用户的权限
访问被拒绝. 说明: 访问服务此请求所需的资源时出错.服务器可能未配置为访问所请求的 URL. 错误消息 401.2.: 未经授权: 服务器配置导致登录失败.请验证您是否有权基于您提供的凭据和 Web ...
- 话题讨论&征文--谈论大数据时我们在谈什么 获奖名单发布
从社会发展趋势的角度,非常明显大数据会是眼下肉眼可及的视野范围里能看到的最大趋势之中的一个.从传统IT 业到互联网.互联网到移动互联网,从以智能手机和Pad 为主要终端载体的移动互联网到可穿戴设备的移 ...
- 小程序 富文本 的页面展示 json 数据处理 go-echo 为小程序提供feed流服务
go生成页面 返回给web-view {{define "DBHtmlCode"}} <!DOCTYPE html> <html lang="zh-cm ...
- 如何分析一个已有的Delphi项目源代码
分析一个已有的Delphi项目,应该从以下入手(按先后顺序):1. 编译条件,包括自定义的Condition以及inc文件里的标识2. 主项目文件dpr,因为窗体的windows消息循环只是程序的一部 ...
- 增删改查,连接数据库UsersDao
package com.abc.dao; import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.Re ...
- Cocos2d-x动画播放(序列帧)
简介 Cocos2d-x中,动画的具体内容是依靠精灵显示出来的,为了显示动态图片,我们需要不停切换精灵显示的内容,通过把静态的精灵变为动画播放器从而实现动画效果.动画由帧组成,每一帧都是一个纹理,我们 ...
- Objectvice-C中的super
/** 狗:哈士奇 */ //僵尸 #import <Foundation/Foundation.h> @interface Dog : NSObject - (void) walk; + ...
- Javascript高级程序设计笔记(很重要尤其是对象的设计模式与继承)
var obj = {'a':'a'}; var fun = function (){} console.log(typeof obj);//object console.log(typeof fun ...
- Codeforces Round #379 (Div. 2) E. Anton and Tree —— 缩点 + 树上最长路
题目链接:http://codeforces.com/contest/734/problem/E E. Anton and Tree time limit per test 3 seconds mem ...