题目背景

_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. c# String ,String[] 和 List<String>之间的转换

    C#对字符串进行处理时,经常需要进行String,String[]和List<String>之间的转换 本文分析一下它们的差异和转换 一. 1. String > String[] ...

  2. 将传统 WPF 程序迁移到 DotNetCore 3.0

    介绍 由于历史原因,基于 Windows 平台存在着大量的基于 .NetFramework 开发的 WPF 和 WinForm 相关程序,如果将这些程序全部基于 DotNetCore 3.0 重写一遍 ...

  3. js函数式编程术语总结 - 持续更新

    参考文档1 参考文档2 函数式编程术语 高阶函数 Higher-Order Functions 以函数为参数的函数 返回一个函数的函数 函数的元 Arity 比如,一个带有两个参数的函数被称为二元函数 ...

  4. shell 查找与替换

    grep sed 如果想把一个字符串中的一些字符删除可以如此:#Echo “2006-11-21 22:16:30” | sed ‘s/-//g’ | sed ‘s/ //g’ | sed ‘s/:/ ...

  5. 清理mac的硬盘空间,清理Xcode,清除“其他”

    下面是一些清理的方法:打开Finder使用快捷键command+shift+g输入路径即可进入该文件夹 1. 移除DerivedData,建议定期清理,会重新生成 此文件夹内是模拟器运行每个APP生成 ...

  6. adb 查看 android手机的CPU架构

    adb shell cat  /proc/cpuinfo 当然要下载adb并配置好环境变量

  7. 文件去除git版本控制

    git的版本控制是由其文件中的 .git文件来进行控制,但是这个文件一般情况是隐藏的. 想去除git的版本控制,有两种方式. 1.可以直接将其中的.git文件找出并删除 2.还可以通过命令的方式来操作 ...

  8. Powershell-创建Module

    1.找到默认module路径,ISE启动时自动加载默认领下的Module代码. $env:PSModulePath 2.在其中一个默认路径下创建个文件夹,在文件夹下创建一个.psm1后缀文件,注意文件 ...

  9. 【HANA系列】SAP HANA XS使用JavaScript编程详解

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA XS使用Jav ...

  10. ILRuntime入门笔记

    基础知识 官方地址:https://github.com/Ourpalm/ILRuntime 官方文档:https://ourpalm.github.io/ILRuntime/ 文档Markdown源 ...