当前位置: 首页 > news >正文

牛客 NC208246 胖胖的牛牛

题目描述

每逢佳节胖三斤,牛牛在过去的节日里长胖了,连拐弯都困难,甚至会卡在门上,所以他很讨厌拐弯。给你一个N*N(2≤N≤100)的方格中,‘x’表示障碍,‘.’表示没有障碍(可以走),牛牛可以从一个格子走到他相邻的四个格子,但是不能走出这些格子。问牛牛从A点到B点最少需要转90度的弯几次。

输入描述:

 
 

第一行一个整数:N,下面N 行,每行N 个字符,只出现字符:‘.’,‘x’,‘A’,‘B’;表示上面所说的矩阵格子,每个字符后有一个空格。

输出描述:

一个整数:最少转弯次数。如果不能到达,输出-1。

示例1

输入

复制

3
. x A
. . .
B x .

输出

复制

2

备注:

 
 

开始和结束时的方向任意。

思路:要求最小的转向次数,可以用深度优先搜索加优先队列,队列按照转向次数从小到大排序,每次入队当前点坐标和前驱点坐标以及到当前点的转向次数,在出队时将相关点标记不再搜索,第一次遍历到终点的转向次数即是答案;

        因为只要存在转向那么下一点的x和y坐标必与前驱点的x和y坐标不同,于是我们可以利用前驱点坐标来判断是否转向;

AC代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;

const int N=110;

char mp[N][N];
int n,m,sx,sy,ex,ey;
bool st[N][N];
int dx[]={1,-1,0,0},dy[]={0,0,1,-1};
struct Node
{
	int x,y,px,py;
	int cnt;
	bool operator<(const Node&t)const
	{
		return cnt>t.cnt;
	}
};

int bfs()
{
	priority_queue<Node> q;
	q.push({sx,sy,sx,sy,0});
	st[sx][sy]=1;
	
	while(q.size())
	{
		Node t=q.top();
		q.pop();
		int x=t.x,y=t.y;
		if(x==ex&&y==ey)return t.cnt;
		
		st[x][y]=1;
		
		for(int i=0;i<4;i++)
		{
			int xx=x+dx[i],yy=y+dy[i];
			if(xx<0||xx>n-1||yy<0||yy>n-1)
				continue;
			if(mp[xx][yy]=='x'||st[xx][yy])
				continue;
			
			int isTurn=(t.px!=xx&&t.py!=yy);
			q.push({xx,yy,x,y,t.cnt+isTurn});
		}
	}
	
	return -1;
}

int main()
{
	cin>>n;
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
		{
			cin>>mp[i][j];
			if(mp[i][j]=='A')
				sx=i,sy=j;
			if(mp[i][j]=='B')
				ex=i,ey=j;
		}	
	
	cout<<bfs()<<endl;
}

思路:要求最小的转向次数,可以用深度优先搜索加优先队列,队列按照转向次数从小到大排序,每次入队当前点坐标和前驱点坐标以及到当前点的转向次数,在出队时将相关点标记不再搜索,第一次遍历到终点的转向次数即是答案;

        因为只要存在转向那么下一点的x和y坐标必与前驱点的x和y坐标不同,于是我们可以利用前驱点坐标来判断是否转向;

思路:要求最小的转向次数,可以用深度优先搜索加优先队列,队列按照转向次数从小到大排序,每次入队当前点坐标和前驱点坐标以及到当前点的转向次数,在出队时将相关点标记不再搜索,第一次遍历到终点的转向次数即是答案;

        因为只要存在转向那么下一点的x和y坐标必与前驱点的x和y坐标不同,于是我们可以利用前驱点坐标来判断是否转向;

思路:要求最小的转向次数,可以用深度优先搜索加优先队列,队列按照转向次数从小到大排序,每次入队当前点坐标和前驱点坐标以及到当前点的转向次数,在出队时将相关点标记不再搜索,第一次遍历到终点的转向次数即是答案;

        因为只要存在转向那么下一点的x和y坐标必与前驱点的x和y坐标不同,于是我们可以利用前驱点坐标来判断是否转向;

相关文章:

  • 源码安装nginx及其配置
  • Vue element-ui表格嵌进度条
  • 前后数据传输协议规范
  • Unions
  • 基于springboot的地质灾害应急管理系统
  • Structures
  • 向量数据库入坑指南:聊聊来自元宇宙大厂 Meta 的相似度检索技术 Faiss
  • 电子邮件营销新趋势-自动化
  • ICT产业关联效应的国际比较——基于投入产出的分析
  • 【algorithm】算法学习----堆
  • Q_ENUM Q_ENUMS Q_ENUM_NS Q_FLAG Q_FLAGS Q_FLAG_NS
  • 国外5G行业应用产业政策分析及对我国的启示
  • 【C语言】文件输入输出操作
  • 【教3妹学算法-每日一题】竞赛题:6171. 和相等的子数组
  • 遗传算法GA求解非连续函数问题
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • Hexo+码云+git快速搭建免费的静态Blog
  • Javascripit类型转换比较那点事儿,双等号(==)
  • JavaScript中的对象个人分享
  • Making An Indicator With Pure CSS
  • Otto开发初探——微服务依赖管理新利器
  • Spark学习笔记之相关记录
  • tensorflow学习笔记3——MNIST应用篇
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 彻底搞懂浏览器Event-loop
  • 猴子数据域名防封接口降低小说被封的风险
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 前端路由实现-history
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 入口文件开始,分析Vue源码实现
  • 使用parted解决大于2T的磁盘分区
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 微信小程序--------语音识别(前端自己也能玩)
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (11)MSP430F5529 定时器B
  • (39)STM32——FLASH闪存
  • (floyd+补集) poj 3275
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (三分钟)速览传统边缘检测算子
  • (五)Python 垃圾回收机制
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)jQuery 基础
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .net分布式压力测试工具(Beetle.DT)
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • @GetMapping和@RequestMapping的区别
  • @vue/cli脚手架
  • [28期] lamp兄弟连28期学员手册,请大家务必看一下
  • [3D游戏开发实践] Cocos Cyberpunk 源码解读-高中低端机性能适配策略
  • [ANT] 项目中应用ANT
  • [ArcPy百科]第三节: Geometry信息中的空间参考解析