牛客 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坐标不同,于是我们可以利用前驱点坐标来判断是否转向;
牛客 NC208246 胖胖的牛牛相关推荐
- 解题报告 - 牛客练习赛63 C - 牛牛的揠苗助长(货仓选址+二分)
链接:https://ac.nowcoder.com/acm/contest/5531/C 来源:牛客网 题目描述 牛牛有一块长度大小为n的菜园,他首先对这块菜园从1到n进行了编号,每一块地分别为1号 ...
- 牛客 怕npy的牛牛(双指针)
文章目录 1. 题目 2. 解题 1. 题目 链接:https://ac.nowcoder.com/acm/contest/9556/B 来源:牛客网 题目描述 牛牛非常怕他的女朋友,怕到了走火入魔的 ...
- 牛客练习赛68 B.牛牛的算术
牛客练习赛68 B.牛牛的算术 题目链接 题目描述 牛牛最近学习了取模是什么 于是他看到了下面这一道题: 多次询问:每次询问包含一个正整数 n 要求你输出下列结果 ∏i=1n∑j=1i∑k=1ji×j ...
- 牛客练习赛63 C.牛牛的揠苗助长
牛客练习赛63 C.牛牛的揠苗助长 题目链接 题目描述 牛牛有一块长度大小为n的菜园,他首先对这块菜园从1到n进行了编号,每一块地分别为1号.2号-n号菜地,然后他往每块菜地中都种下了一些水稻,一开始 ...
- 牛客练习赛68 A.牛牛的mex
牛客练习赛68 A.牛牛的mex 题目链接 题目描述 牛牛现在有一个长度为 nnn 的序列 a1,a2,-,ana_1,a_2,\ldots,a_na1,a2,-,an.现在牛牛有 qqq 次询 ...
- NC208246 胖胖的牛牛
NC208246 胖胖的牛牛 #include <iostream> #include <cstring> #include <queue> #include &l ...
- 牛客练习赛63 F 牛牛的树行棋 (SG函数+树差分)
链接:https://ac.nowcoder.com/acm/contest/5531/F 来源:牛客网 牛牛的树行棋 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K, ...
- 牛客练习赛76 E 牛牛数数(线性基加二分)
牛客地址 思路:全部组合异或,很容易想到使用线性基,正好线性基中有一个求第k小的用法,那我们可以二分来找 K是第几小的数,然后用总数减去. #include <iostream> #inc ...
- 手把手带你学python—牛客网python基础 牛牛的逻辑运算
牛客是一款不论是面试 还是刷题 都是非常有用的 还等什么,传送门- 牛客网python基础
最新文章
- Druid数据库连接池使用参考
- Socket/ServerSocket 选项
- 深度 | 推荐系统评估
- Science综述:人类与微生物共进退
- web软件测试 测试报告模板_杭州软件测试培训要多长时间?需要学习什么内容?...
- 机器学习算法GBDT的面试总结
- LeetCode 35. Search Insert Position
- html5设置data,HTML5自定义data属性
- 队列C++ | 用数组实现队列_1
- git已经删除了远程分支,但本地环境仍能看到远程分支
- 如何不运用第三方变量实现两个数的交换
- 数学建模PPT(二)
- 2、网站重构之本地映射外网域名
- C语言之-1与0xffffffff
- PD runner下载和使用教程
- mysql after 不起作用_mysql之触发器before和after的区别(2)
- 全文检索系统技术架构及流程说明
- linux建立数据库及构建表
- 编程基础之二十一:导师巴贝奇与Ada(四)
- 虚拟机连接不上网络,解决办法