题目描述

每逢佳节胖三斤,牛牛在过去的节日里长胖了,连拐弯都困难,甚至会卡在门上,所以他很讨厌拐弯。给你一个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坐标不同,于是我们可以利用前驱点坐标来判断是否转向;

牛客 NC208246 胖胖的牛牛相关推荐

  1. 解题报告 - 牛客练习赛63 C - 牛牛的揠苗助长(货仓选址+二分)

    链接:https://ac.nowcoder.com/acm/contest/5531/C 来源:牛客网 题目描述 牛牛有一块长度大小为n的菜园,他首先对这块菜园从1到n进行了编号,每一块地分别为1号 ...

  2. 牛客 怕npy的牛牛(双指针)

    文章目录 1. 题目 2. 解题 1. 题目 链接:https://ac.nowcoder.com/acm/contest/9556/B 来源:牛客网 题目描述 牛牛非常怕他的女朋友,怕到了走火入魔的 ...

  3. 牛客练习赛68 B.牛牛的算术

    牛客练习赛68 B.牛牛的算术 题目链接 题目描述 牛牛最近学习了取模是什么 于是他看到了下面这一道题: 多次询问:每次询问包含一个正整数 n 要求你输出下列结果 ∏i=1n∑j=1i∑k=1ji×j ...

  4. 牛客练习赛63 C.牛牛的揠苗助长

    牛客练习赛63 C.牛牛的揠苗助长 题目链接 题目描述 牛牛有一块长度大小为n的菜园,他首先对这块菜园从1到n进行了编号,每一块地分别为1号.2号-n号菜地,然后他往每块菜地中都种下了一些水稻,一开始 ...

  5. 牛客练习赛68 A.牛牛的mex

    牛客练习赛68 A.牛牛的mex 题目链接 题目描述 牛牛现在有一个长度为 nnn 的序列 a1,a2,-,ana_1,a_2,\ldots,a_na1​,a2​,-,an​.现在牛牛有 qqq 次询 ...

  6. NC208246 胖胖的牛牛

    NC208246 胖胖的牛牛 #include <iostream> #include <cstring> #include <queue> #include &l ...

  7. 牛客练习赛63 F 牛牛的树行棋 (SG函数+树差分)

    链接:https://ac.nowcoder.com/acm/contest/5531/F 来源:牛客网 牛牛的树行棋 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K, ...

  8. 牛客练习赛76 E 牛牛数数(线性基加二分)

    牛客地址 思路:全部组合异或,很容易想到使用线性基,正好线性基中有一个求第k小的用法,那我们可以二分来找 K是第几小的数,然后用总数减去. #include <iostream> #inc ...

  9. 手把手带你学python—牛客网python基础 牛牛的逻辑运算

      牛客是一款不论是面试 还是刷题 都是非常有用的 还等什么,传送门- 牛客网python基础

最新文章

  1. Druid数据库连接池使用参考
  2. Socket/ServerSocket 选项
  3. 深度 | 推荐系统评估
  4. Science综述:人类与微生物共进退
  5. web软件测试 测试报告模板_杭州软件测试培训要多长时间?需要学习什么内容?...
  6. 机器学习算法GBDT的面试总结
  7. LeetCode 35. Search Insert Position
  8. html5设置data,HTML5自定义data属性
  9. 队列C++ | 用数组实现队列_1
  10. git已经删除了远程分支,但本地环境仍能看到远程分支
  11. 如何不运用第三方变量实现两个数的交换
  12. 数学建模PPT(二)
  13. 2、网站重构之本地映射外网域名
  14. C语言之-1与0xffffffff
  15. PD runner下载和使用教程
  16. mysql after 不起作用_mysql之触发器before和after的区别(2)
  17. 全文检索系统技术架构及流程说明
  18. linux建立数据库及构建表
  19. 编程基础之二十一:导师巴贝奇与Ada(四)
  20. 虚拟机连接不上网络,解决办法

热门文章

  1. 流年如风卷起梅花飘零的记忆
  2. 语音识别数据集及性能评测指标WER
  3. [论文写作笔记] C4以小窥大的摘要 C5 讲故事一样的引言
  4. STM32CubeMx开发之路—使用SysTick实现微妙延时函数delay_us()
  5. 埋点 神策小程序_神策埋点思路
  6. PPT中如何插入带圈的11
  7. mongodb基本语法及操作(增删改查)
  8. 有关秩的等式和不等式
  9. 用Python校验下载文件的完整性(md5),游戏之类的大型文件
  10. wps上下标怎么对齐_wps如何设置表格对齐方式图解