2017/1/22

机器人搬重物

(robot.cpp/c/pas)

机器人移动学会(RMI)现在正尝试用机器人搬运物品。机器人的形状是一个直径1.6 米的球。在试验阶段,机器人被用于在一个储藏室中搬运货物。储藏室是一个N*M 的网格, 有些格子为不可移动的障碍。机器人的中心总是在格点上,当然,机器人必须在最短的时间 内把物品搬运到指定的地方。机器人接受的指令有:先前移动1 步(Creep);向前移动2 步(Walk );向前移动3 步(Run);向左转(Left);向右转(Right)。每个指令所需要的时 间为1 秒。请你计算一下机器人完成任务所需的最少时间。

输入
输入的第一行为两个正整数N,M (N,M<=50),下面N 行是储藏室的构造,0 表示无障
碍,1 表示有障碍,数字之间用一个空格隔开。接着一行有四个整数和一个大写字母,分别
为起始点和目标点左上角网格的行与列,起始时的面对方向(东E,南S,西W,北N),
数与数,数与字母之间均用一个空格隔开。终点的面向方向是任意的。
输出
一个整数,表示机器人完成任务所需的最少时间。如果无法到达,输出-1。

输入样例
9 10
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 1 0 0 0 0
0 0 0 1 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 1 0
7 2 2 7 S

输出样例
12

一个记忆化广搜,记录次数就行了

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <queue>
 6 #include <map>
 7 using namespace std;
 8 bool mm[60][60];
 9 struct point
10 {
11     int x,y,z;
12 };
13 int sx,sy,ex,ey,n,m;
14 char d;
15 int fx[4]={-1,0,1,0},fy[4]={0,1,0,-1};
16 int f[60][60][4];
17 queue<point> q;
18 map<char,int> ma;
19 int main()
20 {
21     freopen("robot.in","r",stdin);
22     freopen("robot.out","w",stdout);
23     cin>>n>>m;
24     ma[‘N‘]=0;
25     ma[‘E‘]=1;
26     ma[‘S‘]=2;
27     ma[‘W‘]=3;
28     for(int i=1;i<=n;i++)
29     for(int j=1;j<=m;j++)
30     {
31         bool b;
32         cin>>b;
33         if(b)
34         {
35         mm[i-1][j-1]=mm[i-1][j]=mm[i][j-1]=mm[i][j]=1;
36         }
37     }
38     n--;
39     m--;
40     cin>>sx>>sy>>ex>>ey>>d;
41     q.push((point){sx,sy,ma[d]});
42     memset(f,127/3,sizeof(f));
43     f[sx][sy][ma[d]]=0;
44     while(!q.empty())
45     {
46     point k=q.front();
47     if(f[k.x][k.y][k.z]+1<f[k.x][k.y][(k.z+1)%4])
48     {
49         f[k.x][k.y][(k.z+1)%4]=f[k.x][k.y][k.z]+1;
50         q.push((point){k.x,k.y,(k.z+1)%4});
51     }
52     if(f[k.x][k.y][k.z]+1<f[k.x][k.y][(k.z+3)%4])
53     {
54         f[k.x][k.y][(k.z+3)%4]=f[k.x][k.y][k.z]+1;
55         q.push((point){k.x,k.y,(k.z+3)%4});
56     }
57     for(int i=1;i<=3;i++)
58     {
59         int nx=k.x+i*fx[k.z],ny=k.y+i*fy[k.z];
60         if((f[k.x][k.y][k.z]+1<f[nx][ny][k.z])&&(mm[nx][ny]!=1)&&nx>0&&nx<=n&&ny>0&&ny<=m)
61         {
62         f[nx][ny][k.z]=f[k.x][k.y][k.z]+1;
63         q.push((point){nx,ny,k.z});
64         }
65         else
66         break;
67     }
68     q.pop();
69     }
70     int mmin=2147483647;
71     for(int i=0;i<=3;i++)
72     if(f[ex][ey][i]<mmin)
73         mmin=f[ex][ey][i];
74     if(mmin<4000)
75     cout<<mmin<<endl;
76     else
77     cout<<-1<<endl;
78     return 0;
79 }
时间: 2024-12-28 15:06:31

2017/1/22的相关文章

【第三组】冲刺会议 2017.7.22

冲刺会议 日期:2017.7.22 开发小组:Geomestry 冲刺经理:程立智 成员: 程立智 李明伦 郑昊 蔡镇泽 温志成 汪涵 成员:程立智 完成工作:完成一键还原 所遇问题: 全屏设置有bug 下一步工作:完善选关界面 成员:李明伦 完成工作:修改关卡类 所遇问题:无 下一步工作:实例化关卡类 成员:郑昊 完成工作:画磁贴,画初始界面 所遇问题:无法判断用户分辨率的缩放 下一步工作:继续实现UI大小自适应 成员:蔡镇泽 完成工作: 直线功能的实现 所遇问题: 直线无法拖动画出 下一步工

2017.12.22 2周5次课

2017.12.22 二周第五次课 2.23/2.24/2.25 find命令 2.26 文件名后缀 2.23/2.24/2.25 find命令 1.学会使用快捷键 1)ctrl+C:结束(终止)当前命令.如果你输人了一大串字符,但不想运行,可以按ctrl+C组合键,此时光标将跳入下一行,而在刚刚的光标处会留下一个^C的标记. 2)Tab:实现自动补全功能.这个键比较重要,使用频率也很高.当你输人命令.文件或目录的前几个字符时,它会自动帮你补全. 3)ctrl+D:退出当前终端.同样,你也可以输

[题解]LCA练习+部分算法复习 2017.1.22

第一题就LCA即可.不过推荐用Tarjan(最快,常数很小).然后Tarjan的时候顺便就出一个dist[i],表示i节点到根节点的距离.求出了LCA,那么两点间的距离就为dist[u] + dist[v] - 2 * dist[lca]. Code 1 #include<iostream> 2 #include<sstream> 3 #include<cstdio> 4 #include<cmath> 5 #include<cstdlib> 6

2017.09.22

刚刚下课,无心学习.想随便写点东西--今天,下雨了,不知道22年前的今天是否也在下雨呢?不过一场秋雨一场寒倒是真的,下去洗完澡去上课,湿漉漉的马路,湿漉漉的我,感觉风至吹头皮--幸好拿了伞.今天就吃了一顿饭(没有吃面条有点遗憾),不过我有许愿啊,虽然不知道会不会实现... 上课YQ老师一直举例子,我就莫名想起上通信原理的那些日子,W老师也是这样,我也最愿意上他的课了,可是现在喜欢的课没有了,连熟悉的老师面庞也并不能看到了.上个星期回了一次学校,恰巧碰见所有老师在开会,我一进去,那感觉就像嫁出去的

2017.7.22 hnoi2016 最小公倍数

#include<cmath> #include<cstdio> #include<iostream> #include<algorithm> #define N 50010 #define M 100010 #define RG register #define inf 0x3f3f3f3f using namespace std; bool ans[N]; struct stac{ int u,v,op; }sta[40000]; struct node

2017.07.22 Python网络爬虫之简单的Python脚本

1.九九乘法表: # !usr/bin/env python# -*- coding:utf-8 -*- class PrintTable(object): """打印九九乘法表""" def __init__(self): print(u"开始打印9x9乘法表格") self.print99() def print99(self): for i in xrange(1,10): for j in xrange(1,i+1):

【第二组】项目冲刺(Beta版本)第四次每日例会 2017/7/22

项目冲刺(Beta阶段)第四次每日例会 开发小组:Hunter 冲刺经理:林贵渊 小组成员:林轩宇,李明君,刘仁人,张太 1.每日例会内容 (1)昨天做了什么 1.林轩宇:后端功能实现. 2.刘仁人:道具商城内容. 3.张太:游戏内容构思. 4.李明君:用户上传任务功能实现. 5.林贵渊:用户上传任务功能实现. (2)遇到了什么问题 1.林轩宇:暂时没有问题. 2.李明君:LOGO设计灵感及审美问题. 3.张太:更换背景功能实现问题. 4.刘仁人:优化控件制作难度大. 5.林贵渊:暂时没有问题.

2017/05/22 java 基础 随笔

多态:一种事物多种形态 前提:1.子父类继承关系 2.方法复写.重写 3.父类引用指向子类对象 package com.huawei; public class Demo1 { public static void main(String[] args) { Fu f=new Zi(); System.out.println(f.num); } } class Fu{ int num=10; } class Zi extends Fu{ int num=20; }执行结果是10,原因见下图,说白

2017.3.22上午学习内容

做了一套英语试题,并复习了第四单元单词和第八单元词汇,对买的课程进行分类总结