题目背景

_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. FTP方式部署Azure Web App

    创建部署凭据 在仪表盘中创建或重置部署凭据,在凭据中设置用户名和密码. 通过FTP方式打开Web根目录 在本地资源管理器中打开FTP地址(例如:ftp://cnws-prod-sha-001.ftp. ...

  2. 简述Servlet的基本概念

    Servlet的基本概念 Servlet的概念 http协议作用于客户端-服务端.由客户端发送请求(Request),服务器端接收到数据之后,向客户端发送响应(Response),这就是请求-响应模式 ...

  3. Linux用户组权限简单解析

    Linux的用户是以组为单位,每个用户都属于某一个组,而用户组的权限,是指某个用户对某个文件(文件夹)的操作权限,这里涉及用户组的概念. 其中root用户拥有全Linux系统中最高的权限,比任何其他用 ...

  4. typescript类的修饰符

    学习过java的小姐姐,小哥哥应该很好理解,但还是啰嗦的写出来! typescript里面定义属性的时候给我们提供了 三种修饰符 public :公有 在当前类里面. 子类 .类外面都可以访问 pro ...

  5. MyDAL - .Where() & .And() & .Or() 使用

    索引: 目录索引 一.API 列表 1.Where .Where(Func<M, bool> func) 如: .Where( it => (it.Prop1>=条件1 &am ...

  6. vue(9)—— 组件化开发 - webpack(3)

    前面两个终于把webpack相关配置解析完了.现在终于进入vue的开发了 vue组件化开发预热 前期准备 创建如下项目: app.js: footer.js: main.js: webpack.con ...

  7. 金蝶K3外购入库单单价取数规则调整

    涉及界面: 问题:财务抱怨外购入库单价格取错,单价多除了一次税率 例如,采购单里面注明了价格是不含税15.3256 结果在外购入库单里面,又自做主张除以税率17%,把采购成本搞成了13.0988, 咨 ...

  8. 记录Nginx代理的配置

    server { listen  80; server_name localhost; location / { root    /ect/share/nginx/html; index   inde ...

  9. python3 员工信息表

    这是最后一条NLP了......来吧 十二,动机和情绪总不会错,只是行为没有效果而已 动机在潜意识里,总是正面的.潜意识从来不会伤害自己,只会误会的以为某行为可以满足该动机,而又不知道有其他做法的可能 ...

  10. 数据库【redis】基本命令

    redis常用命令大全   1.基于内存的key-value数据库 2.基于c语言编写的,可以支持多种语言的api //set每秒11万次,取get 81000次 3.支持数据持久化 4.value可 ...