题目背景

_GC买了一双蔡徐坤一代。

题目描述

_GC进入了一个n*m的迷宫。
本题的特殊之处在于,_GC只能滑着走。具体来说就是,选定一个方向后,_GC会一直向该方向滑,直到撞到墙。
会给出_GC的起始位置。只需要滑出去即可。
求最小的撞墙次数。

输入输出格式

输入格式:

第一行两个整数n,m表示迷宫大小。
下面n行,每行m个整数,0表示空地,1表示墙。
最后一行两个整数sx,sy表示_GC初始位置。

输出格式:

走出迷宫的最小撞墙次数。无解请输出-1。

输入输出样例

输入样例#1: 复制

5 6
1 1 1 1 1 0
1 0 1 0 0 0
1 0 0 1 0 1
1 0 0 0 0 1
1 1 0 0 1 1
2 2
输出样例#1: 复制

3
输入样例#2: 复制

5 3
1 1 1
1 0 1
0 0 1
1 0 1
1 1 1
2 2
输出样例#2: 复制

-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滑迷宫的更多相关文章

  1. 对于BFS的理解和部分例题(

    (图文无关    雾 搜索是一个NOIP当中经常出现的考点,其实搜索换个方式来想也无非就是让电脑来帮你试,最后得到一个结果,当然这么口胡谁都会,那么我们就来看看搜索当中的一个大部分: BFS(广度优先 ...

  2. 关于BFS和dijkstra(2019.04.20)

    我的BFS板子 struct node{/*略*/};//表示一个状态 std::map<node,bool>vis;//判断每个状态是否已访问过 std::queue<node&g ...

  3. NYOJ306 走迷宫(dfs+二分搜索)

    题目描写叙述 http://acm.nyist.net/JudgeOnline/problem.php?pid=306 Dr.Kong设计的机器人卡多非常爱玩.它经常偷偷跑出实验室,在某个游乐场玩之不 ...

  4. H5单页面手势滑屏切换原理

    H5单页面手势滑屏切换是采用HTML5 触摸事件(Touch) 和 CSS3动画(Transform,Transition)来实现的,效果图如下所示,本文简单说一下其实现原理和主要思路. 1.实现原理 ...

  5. C语言动态走迷宫

    曾经用C语言做过的动态走迷宫程序,先分享代码如下: 代码如下: //头文件 #include<stdio.h> #include<windows.h>//Sleep(500)函 ...

  6. CSS3鼠标滑过图标放大以及旋转

    本人是HTML5-CSS3初学者,这次分享一款纯CSS3实现的图片动画,当鼠标滑过小图标时,图标会放大,同时图标会出现旋转的动画效果.我们在很多个性化个人博客中经常看到鼠标滑过人物头像后头像图片旋转就 ...

  7. CSS3鼠标滑过动画线条边框特效

    基于CSS属性animation动画制作,效果流畅弹性十足 效果展示 http://hovertree.com/texiao/css3/32/ 源码下载:http://hovertree.com/h/ ...

  8. Cell右滑 多个编辑选项栏

    简单粗暴,一看就能明白 关于右滑cell,能滑出来两个以上的选项栏,可以如下这么做,但是要注意下面的注意事项,就是关于iOS8前后的问题,注释写的很清楚了.可以直接复制到自己的代码里看的会更明白. / ...

  9. 【原】移动web滑屏框架分享

    本月26号参加webrebuild深圳站,会上听了彪叔的对初心的讲解,“工匠精神”这个词又一次被提出,也再次引起了我对它的思考.专注一个项目并把它做得好,很好,更好...现实工作中,忙忙碌碌,抱着完成 ...

随机推荐

  1. jQuery(九)、ajax对象操作

    1 数组和对象操作 1.jQuery.extend([deep,] target, object1, [objectN]) 用一个或多个其他对象来扩展一个对象,返回被扩展的对象. 如果不指定targe ...

  2. unity transform 常用操作

    1.寻找物体 1.1 寻找满足条件的子物体 ` public static Transform FindObj(Transform transform, Func<Transform, bool ...

  3. MySQL事务及ACID特性

    一.事物 1.定义:事务是访问和更新数据库的程序执行单元,事务中包含一条或者多条SQL语句,这些语句要么全部执行成功,要么都不执行. 在MySQL中,事务支持是在引擎层实现的,MySQL是一个支持多引 ...

  4. 剑指前端(前端入门笔记系列)—— JS基本数据类型及其类型转换

    基本数据类型 ECMAScript中有5中简单数据类型性(也称为基本数据类型):Undefined.Null.Boolean.Number和String,还有一种复杂数据类型——Object,Obje ...

  5. 图像的膨胀与腐蚀——OpenCV与C++的具体实现

    目录 1. 膨胀与腐蚀的原理 2. 膨胀的具体实现 1) OpenCV实现 2) C/C++实现 3) 验证与结果 3. 腐蚀的具体实现 1. 膨胀与腐蚀的原理 膨胀与腐蚀是数学形态学在图像处理中最基 ...

  6. 使用Huginn抓取Discourse论坛

    Hi! I don't know why the xpath does not work, but have an easier solution. Discourse also has a JSON ...

  7. Android Studio教程11-RecycleView的使用

    目录 1. RecyclerView 1.1. Add support library 1.2. 将RecyclerView添加到布局 1.3. 主actiivty中如何调用recycleview对象 ...

  8. mysql基本操作(1)

    1.mysql数据库客户端安装 brew install mysql-client 2.mysql 连接数据库 mysql -h <数据库地址> -P <端口> -u < ...

  9. 黑阔主流攻防之不合理的cookie验证方式

    最近博主没事干中(ZIZUOZISHOU),于是拿起某校的习题研究一番,名字很6,叫做黑阔主流攻防习题 虚拟机环境经过一番折腾,配置好后,打开目标地址:192.168.5.155 如图所示 这里看出题 ...

  10. windows docker redis

    拉取docker docker pull hub.c.163.com/library/redis:latest 启动docker docker run -p 6379:6379 -d hub.c.16 ...