洛谷P1126 机器人搬重物【bfs】
题目链接:https://www.luogu.org/problemnew/show/P1126
题意:
给定一个n*m的方格,机器人推着直径是1.6的球在格子的线上运动。
每一秒钟可以向左转,向右转或者直走1步2步或是3步。
现在给定一个起点和开始的朝向,问走到终点至少要多少时间。
思路:
真是一道狗屎坑题。题目给出的是格点,而机器人是在交点上运动的。
盗用一下洛谷@雒仁韬的图。题目给出的障碍物其实是橙色的四个点中的右下角的这个。
而且由于球的直径,最外围边界并不能走到。如果正确理解了题意的话应该就没问题了。
由于有方向,所以用三维数组来存某点是否被访问。
#include<stdio.h>
#include<stdlib.h>
#include<map>
#include<set>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue> using namespace std; int n, m;
int mat[][];
//0E, 1S, 2W, 3N
int dx[][] = {{, , }, {, , }, {, , }, {-, -, -}};
int dy[][] = {{, , }, {, , }, {-, -, -}, {, , }};
bool vis[][][];
struct node{
int x, y;
int dir;
int t;
}st, ed; int getdir(char c)
{
if(c == 'E')return ;
if(c == 'S')return ;
if(c == 'W')return ;
if(c == 'N')return ;
} bool check(int i, int j)
{
return (i >= && i < n && j >= && j < m);
} int main()
{
scanf("%d%d", &n, &m);
for(int i = ; i <= n; i++){
for(int j = ; j <= m; j++){
scanf("%d", &mat[i][j]);
if(mat[i][j]){
mat[i - ][j] = ;
mat[i][j - ] = ;
mat[i - ][j - ] = ;
}
}
} scanf("%d%d%d%d", &st.x, &st.y, &ed.x, &ed.y);
char dir;
//st.x--;st.y--;ed.x--;ed.y--;
getchar();
scanf("%c", &dir);
st.dir = getdir(dir);
st.t = ; queue<node>que;
que.push(st);
vis[st.x][st.y][st.dir] = true;
int ans = -;
while(!que.empty()){
node now = que.front();que.pop();
//cout<<endl<<now.x<<" "<<now.y<<" "<<now.t<<endl;
if(now.x == ed.x && now.y == ed.y){
ans = now.t;
break;
}
node to;
to.x = now.x;to.y = now.y;to.t = now.t + ;
to.dir = (now.dir + ) % ;
if(!vis[to.x][to.y][to.dir]){
vis[to.x][to.y][to.dir] = true;
que.push(to);
}
to.dir = (now.dir - + ) % ;
if(!vis[to.x][to.y][to.dir]){
vis[to.x][to.y][to.dir] = true;
que.push(to);
} to.dir = now.dir;
for(int i = ; i < ; i++){
to.x = now.x + dx[to.dir][i];
to.y = now.y + dy[to.dir][i];
if(mat[to.x][to.y])break;
if(check(to.x, to.y) && !vis[to.x][to.y][to.dir]){
vis[to.x][to.y][to.dir] = true;
que.push(to);
//cout<<to.x<<" "<<to.y<<" "<<to.t<<endl;
}
}
} cout<<ans<<endl; return ;
}
洛谷P1126 机器人搬重物【bfs】的更多相关文章
- 洛谷P1126机器人搬重物[BFS]
题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格,有些格子为不可移动的障碍.机 ...
- 洛谷P1126 机器人搬重物
洛谷1126 机器人搬重物 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格, ...
- 洛谷——P1126 机器人搬重物
P1126 机器人搬重物 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格,有 ...
- 洛谷 P1126 机器人搬重物 (BFS)
题目链接:https://www.luogu.org/problemnew/show/P1126 吐槽:这题很阴险 一开始没把格子图转化成点图:30分 转化成点图,发现样例过不去,原来每步要判断vis ...
- 洛谷 P1126 机器人搬重物
题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径 $1.6 米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个 N×MN \times MN×M ...
- 洛谷—— P1126 机器人搬重物
https://www.luogu.org/problem/show?pid=1126 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机 ...
- luogu P1126 机器人搬重物 题解
luogu P1126 机器人搬重物 题解 题目描述 机器人移动学会(\(RMI\))现在正尝试用机器人搬运物品.机器人的形状是一个直径\(1.6\)米的球.在试验阶段,机器人被用于在一个储藏室中搬运 ...
- P1126 机器人搬重物
P1126 机器人搬重物 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格,有 ...
- luogu P1126 机器人搬重物
题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格,有些格子为不可移动的障碍.机 ...
随机推荐
- C# System.Collections.Stack
using System; using System.Collections; public class SamplesStack { public static void Main() { // C ...
- TCMalloc小记(转)
一. 原理 tcmalloc就是一个内存分配器,管理堆内存,主要影响malloc和free,用于降低频繁分配.释放内存造成的性能损耗,并且有效地控制内存碎片.glibc中的内存分配器是ptmalloc ...
- [BetterExplained]为什么你应该(从现在开始就)写博客
(一)为什么你应该(从现在开始就)写博客 用一句话来说就是,写一个博客有很多好处,却没有任何明显的坏处.(阿灵顿的情况属于例外,而非常态,就像不能拿抽烟活到一百岁的英国老太太的个例来反驳抽烟对健康的极 ...
- Swift 计算三角形角度、两条边夹角
/// 计算三点之间的角度 /// /// - Parameters: /// - p1: 点1 /// - p2: 点2(也是角度所在点) /// - p3: 点3 /// - Returns: 角 ...
- Tumblr 架构设计
英文原文:The Tumblr Architecture Yahoo Bought For A Cool Billion Dollars 最近的新闻中我们得知雅虎11亿美元收购了Tumblr: Yah ...
- C++11 并发指南四(<future> 详解三 std::future & std::shared_future)
上一讲<C++11 并发指南四(<future> 详解二 std::packaged_task 介绍)>主要介绍了 <future> 头文件中的 std::pack ...
- MySQL 5.6新特性 -- Multi-Range Read
如果基表很大,数据没有被缓存,在二级索引上使用范围扫描读取行可能会导致大量的随机磁盘访问.使用Multi-Range Read新特性,mysql可以减少对磁盘的随机读的次数:首先,mysql只是扫描索 ...
- Nginx 指令目录(中文版)
指令大全 accept_mutex accept_mutex_delay access_log add_after_body add_before_body add_header addition_t ...
- 从NSTimer的失效性谈起(二):关于GCD Timer和libdispatch
一.GCD Timer的创建和安放 尽管GCD Timer并不依赖于NSRunLoop,可是有没有可能在某种情况下,GCD Timer也失效了?就好比一開始我们也不知道NSTimer相应着一个runl ...
- YouTube上最火的十个大数据视频
http://blog.jobbole.com/84148/ YouTube上最火的十个大数据视频