U68364 _GC滑迷宫
题目背景
_GC买了一双蔡徐坤一代。
题目描述
_GC进入了一个n*m的迷宫。
本题的特殊之处在于,_GC只能滑着走。具体来说就是,选定一个方向后,_GC会一直向该方向滑,直到撞到墙。
会给出_GC的起始位置。只需要滑出去即可。
求最小的撞墙次数。
输入输出格式
输入格式:
第一行两个整数n,m表示迷宫大小。
下面n行,每行m个整数,0表示空地,1表示墙。
最后一行两个整数sx,sy表示_GC初始位置。
输出格式:
走出迷宫的最小撞墙次数。无解请输出-1。
输入输出样例
说明
1\leq n,m\leq 201≤n,m≤20 由于出题人太菜不会自动生成数据,数据都是手算的,可能有锅+很水
………………………………………………分割线~………………………………………………………
话说此题非常有趣啊,竟然是以我们的童鞋的大名为题......
好了进入正题:
既然是走迷宫的题目,那么此题应该就是一个搜索题,毋庸置疑吧。
但是和其他迷宫题不同的是:这个笨拙的_GC竟然要滑到墙上
那也好办,就比普通的迷宫题多了个步骤:只要前方没有障碍物,就让他一直滑下去,直到撞墙残忍,所用步数还是为1
int xx=h.x,yy=h.y; //记录这个点的位置
while(pd(xx+dx[i],yy+dy[i])) //如果这个方向没有障碍物,一直滑下去,pd是判断是否在迷宫内且当前方向的前方是否有障碍物
{
xx+=dx[i];
yy+=dy[i];
}
解决完这个问题,就可以上代码啦:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
int m,n,sx,sy;
int dx[]={,,,-},dy[]={,,-,}; //四个方向
bool a[][],vis[][]; //a数组存放迷宫,vis数组存放当前点是否到达过
struct pos //定义pos结构体,里面有横纵坐标及到达该点所撞墙的次数
{
int x,y,step;
pos(int x,int y,int step) : x(x),y(y),step(step){} //构造函数,意思是将括号里的值赋给外面的变量
};
queue<pos> q; //定义q队列,用到的头文件就是#include<queue>
inline bool pd(int x,int y) //判断当前点是否在迷宫里且当前方向的前方是否有障碍物
{
return x>=&&x<=m&&y>=&&y<=n&&a[x][y]==; //如果为真,返回1;如果为假,返回0
}
bool out(int x,int y) //判断_GC是否能滑出迷宫
{
return (x==||x==m||y==||y==n)&&a[x][y]==;
}
int main()
{
cin>>m>>n;
for(int i=;i<=m;i++)
for(int j=;j<=n;j++)
scanf("%d",&a[i][j]);
cin>>sx>>sy; //起点坐标
if(a[sx][sy]==) {cout<<-;return ;} //神奇的卡墙,判无解
if(out(sx,sy)==) {cout<<;return ;} //如果本来就在出口,那么撞墙数为0
q.push(pos(sx,sy,)); //将起点位置入队,并将坐标位置和撞墙次数赋值
vis[sx][sy]=; //将起点位置标记为“1”
while(!q.empty()) //判队列是否为空
{
pos h=q.front(); //记录队首元素
q.pop(); //队首元素出队
if(out(h.x,h.y)==) {cout<<h.step-;return ;}
for(int i=;i<;i++) //四个方向
{
int xx=h.x,yy=h.y; //记录这个点的位置
while(pd(xx+dx[i],yy+dy[i])) //如果这个方向没有障碍物,一直滑下去
{
xx+=dx[i];
yy+=dy[i];
}
if((xx==h.x&&yy==h.y)||vis[xx][yy]==) continue; //如果位置没变或到达的位置已经遍历过,换方向
vis[xx][yy]=; //将滑完后的点标记为
q.push(pos(xx,yy,h.step+)); //将滑完后的位置入队
}
}
cout<<-; //如果所有点都被遍历过且都为走出,则说明无解
return ;
}
蒟蒻刚学搜索,如果有错请诸位大佬们指出,谢谢qaq!
U68364 _GC滑迷宫的更多相关文章
- 对于BFS的理解和部分例题(
(图文无关 雾 搜索是一个NOIP当中经常出现的考点,其实搜索换个方式来想也无非就是让电脑来帮你试,最后得到一个结果,当然这么口胡谁都会,那么我们就来看看搜索当中的一个大部分: BFS(广度优先 ...
- 关于BFS和dijkstra(2019.04.20)
我的BFS板子 struct node{/*略*/};//表示一个状态 std::map<node,bool>vis;//判断每个状态是否已访问过 std::queue<node&g ...
- NYOJ306 走迷宫(dfs+二分搜索)
题目描写叙述 http://acm.nyist.net/JudgeOnline/problem.php?pid=306 Dr.Kong设计的机器人卡多非常爱玩.它经常偷偷跑出实验室,在某个游乐场玩之不 ...
- H5单页面手势滑屏切换原理
H5单页面手势滑屏切换是采用HTML5 触摸事件(Touch) 和 CSS3动画(Transform,Transition)来实现的,效果图如下所示,本文简单说一下其实现原理和主要思路. 1.实现原理 ...
- C语言动态走迷宫
曾经用C语言做过的动态走迷宫程序,先分享代码如下: 代码如下: //头文件 #include<stdio.h> #include<windows.h>//Sleep(500)函 ...
- CSS3鼠标滑过图标放大以及旋转
本人是HTML5-CSS3初学者,这次分享一款纯CSS3实现的图片动画,当鼠标滑过小图标时,图标会放大,同时图标会出现旋转的动画效果.我们在很多个性化个人博客中经常看到鼠标滑过人物头像后头像图片旋转就 ...
- CSS3鼠标滑过动画线条边框特效
基于CSS属性animation动画制作,效果流畅弹性十足 效果展示 http://hovertree.com/texiao/css3/32/ 源码下载:http://hovertree.com/h/ ...
- Cell右滑 多个编辑选项栏
简单粗暴,一看就能明白 关于右滑cell,能滑出来两个以上的选项栏,可以如下这么做,但是要注意下面的注意事项,就是关于iOS8前后的问题,注释写的很清楚了.可以直接复制到自己的代码里看的会更明白. / ...
- 【原】移动web滑屏框架分享
本月26号参加webrebuild深圳站,会上听了彪叔的对初心的讲解,“工匠精神”这个词又一次被提出,也再次引起了我对它的思考.专注一个项目并把它做得好,很好,更好...现实工作中,忙忙碌碌,抱着完成 ...
随机推荐
- AspNetCore 基于AOP实现Polly的使用
前言 说起AOP,其实我们在做MVC/API 的时候应该没少接触,比如说各种的Fitter 就是典型的AOP了. 本来在使用Polly的时候我最初的打算是使用过滤器来实现的,后来发现实现起来相当的 ...
- C#工具:ASP.NET MVC单例模式(懒汉)实现文件上传
1.SingletonConfigRead帮助类 using System; using System.Collections.Generic; using System.IO; using Syst ...
- C#保留2位小数几种场景总结
场景1: C#保留2位小数,.ToString("f2")确实可以,但是如果这个数字本来就小数点后面三位比如1.253,那么转化之后就会变成1.25.可不可以刚好保留到最后一位不是 ...
- Java笔记(day9~day10)
继承: 好处:1.提高代码复用性: 2.让类之间产生关系,给多态提供了前提: 父类.子类 Java中支持单继承,不直接支持多继承,但对C++的多继承进行了改良 单继承:一个子类只能有一个直接复类 ...
- Docker+SpringBoot远程发布
Docker+SpringBoot远程发布 发布成功后启动: docker run -di --name demo1.1 -p 8080:8085 demo:1.0 docker run 命令大全:h ...
- Android 字体适配方案
开发过程中,按照UI设计尺寸做好UI页面,当用户自定义自己的手机字体大小之后UI完全没法看了,这个时候就在想让app字体大小始终一致就好了 下面看一下,出现的问题和解决方案 做个简单的例子,先 ...
- Android View的重绘过程之Measure
博客首页:http://www.cnblogs.com/kezhuang/p/ View绘制的三部曲, 测量,布局,绘画今天我们分析测量过程 view的测量是从ViewRootImpl发起的,Vie ...
- Android视频录制从不入门到入门系列教程(二)————显示视频图像
1.创建一个空的工程,注意声明下列权限: <uses-permission android:name="android.permission.CAMERA"/> < ...
- python高级(4)—— 虚拟环境安装使用
虚拟环境 什么是虚拟环境 对电脑稍微有点常识的朋友相信都玩过,比如VMware,virtualbox,或者你用电脑端的模拟器玩手机端的游戏也是一样,其实就是一个假的空间,在Python这里,虚拟环境就 ...
- Microsoft Store应用安装路径和应用推荐——如何用Linux命令操控windows
本人是cnblog萌新,刚学编程不久的菜鸟,这是我的第一篇博客,请各位轻喷 Microsoft store安装路径: 相信很多人都跟我一样有强迫症,文件找不到安装目录就不舒服.一开始在系统盘找不到Wi ...