题目背景

_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. 利用SHA-1算法和RSA秘钥进行签名验签(带注释)

    背景介绍 1.SHA 安全散列算法SHA (Secure Hash Algorithm)是美国国家标准和技术局发布的国家标准FIPS PUB 180-1,一般称为SHA-1.其对长度不超过264二进制 ...

  2. .NET CAD二次开发学习 直线画矩形并转换成组

    主要代码: using System;using System.Collections.Generic;using System.Linq;using System.Text;using System ...

  3. javascript 倒计数功能

    最近在项目中遇到一个倒计时功能,在网上没有找到合适的,就自己写了个方法.贴在这里,权且当个记录. export const timeRun = (timeStr, callBack) => { ...

  4. 简简单单的Vue2(简单语法,生命周期,组件)

    既然选择了远方,便只顾风雨兼程! __HANS许 系列:零基础搭建前后端分离项目 系列:零基础搭建前后端分离项目 简单入手 组件 在上面文章,我们简单的讲了前端框架的工程化,也就是MVVM,还有特别聊 ...

  5. Windows环境npm无法生效

    上网查询得知安装完nodejs之后配置windows环境变量只能保证在命令行工具中可以使用npm,如果想在git bash中使用需要再安装一遍 安装后记得配置环境变量

  6. appium+python搭建自动化测试框架_Appium元素定位(二)

    Appium元素定位: 工具:Android\android-sdk\tools    uiautomatorviewer.bat 1. id定位: self.driver.find_element_ ...

  7. ORACLE 查询某表中的某个字段的类型,是否为空,是否有默认值等

    最近写的功能中有这样一个小功能,根据数据库查询此库中是否有某表,如果有,查询某表下面的某个字段的详细信息 其中一种是... select ATC.OWNER, atC.TABLE_NAME, ATC. ...

  8. [FTP]通过FileZilla在阿里云主机上搭建ftp服务器

    前一阵子租了一台服务器主机来玩,正好周末有时间研究了一下怎么搭建ftp server. 准备.首先要下载filezilla client和filezilla server, 下载地址: server: ...

  9. PowerDesigner 提示 Existence of index、key、reference错误

    一.建立一个表后,为何检测出现Existence of index的警告 A table should contain at least one column, one index, one key, ...

  10. C#行转列&绑定DGV

    c#行转列 今天工作中,恰好写到此处,想起之前第一次行转列的时候,卡壳了好久,今天正好碰上,故而花费几分钟,整理成案例,分享到博客上. 这是个很简单的功能,第一次可以使用案例,后面最好能达到信手拈来的 ...