开始时候有点怕, 感觉什么也不会,不过静下来思考思考也就想出来了,一个简单的BFS即可,但是由于队列没有重判,一直爆队列(MLE!)下次一定要注意!

(bfs第一次到达便最优?)

#include<queue>
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int a[52][52];
bool mark[52][52][5]; //三个状态的重判
struct xy
{
int x,y;
int chaoxiang;
int count;
};
int minconmand;
int n,m;
void bfs(xy from,xy last) //如果不判重!必然爆队列!
{
queue<xy>q;
q.push(from);
mark[from.x][from.y][from.chaoxiang]=1;
while(!q.empty())
{
xy cur=q.front();
q.pop();
if(cur.x==last.x&&cur.y==last.y)
{
if(cur.count<minconmand)minconmand=cur.count;
// cout<<minconmand<<endl;
return ;
}
else
{
xy next(cur);
next.count++;
if(next.count>=minconmand)continue;
next.chaoxiang=((next.chaoxiang+1==5)?1:(next.chaoxiang+1));
if(mark[next.x][next.y][next.chaoxiang]==0)
q.push(next);
mark[next.x][next.y][next.chaoxiang]=1; next=cur;
next.count++;
next.chaoxiang=((cur.chaoxiang-1==0)?4:(cur.chaoxiang-1));
if(mark[next.x][next.y][next.chaoxiang]==0)
q.push(next);
mark[next.x][next.y][next.chaoxiang]=1; next=cur;
next.count++;
if(next.chaoxiang==1)
{
for(int i=1;i<=3;i++)
{
next.x-=1;
if(next.y>=n||next.y<=0||next.x<=0||next.x>=m)continue;
if(a[next.x-1][next.y]==1||a[next.x-1][next.y-1]==1)break;
if(mark[next.x][next.y][next.chaoxiang]==0)
q.push(next);
mark[next.x][next.y][next.chaoxiang]=1;
}
}
else if(next.chaoxiang==2)
{
for(int i=1;i<=3;i++)
{
next.y-=1;
if(next.y>=n||next.y<=0||next.x<=0||next.x>=m)continue;
if(a[next.x][next.y-1]==1||a[next.x-1][next.y-1]==1)break;
if(mark[next.x][next.y][next.chaoxiang]==0)
q.push(next);
mark[next.x][next.y][next.chaoxiang]=1;
}
}
else if(next.chaoxiang==3)
{
for(int i=1;i<=3;i++)
{
next.x+=1;
if(next.y>=n||next.y<=0||next.x<=0||next.x>=m)continue;
if(a[next.x][next.y]==1||a[next.x][next.y-1]==1)break;
if(mark[next.x][next.y][next.chaoxiang]==0)
q.push(next);
mark[next.x][next.y][next.chaoxiang]=1;
} }
else if(next.chaoxiang==4)
{
for(int i=1;i<=3;i++)
{
next.y+=1;
if(next.y>=n||next.y<=0||next.x<=0||next.x>=m)continue;
if(a[next.x][next.y]==1||a[next.x-1][next.y]==1)break;
if(mark[next.x][next.y][next.chaoxiang]==0)
q.push(next);
mark[next.x][next.y][next.chaoxiang]=1;
}
}
}
}
return;
}
int main()
{
while(cin>>m>>n&&(n||m))
{
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
cin>>a[i][j];
memset(mark,0,sizeof(mark));
xy from,last;
string chaoxiang;
cin>>from.x>>from.y;
cin>>last.x>>last.y;
cin>>chaoxiang;
from.count=0;
if(chaoxiang=="south")from.chaoxiang=3;
else if(chaoxiang=="north")from.chaoxiang=1;
else if(chaoxiang=="west")from.chaoxiang=2;
else if(chaoxiang=="east")from.chaoxiang=4;
minconmand=1000000;
bfs(from,last);
if(minconmand==1000000)cout<<-1<<endl;
else cout<<minconmand<<endl;
}
}

poj1376 bfs,机器人的更多相关文章

  1. UVa 1600 Patrol Robot (BFS最短路 && 略不一样的vis标记)

    题意 : 机器人要从一个m * n 网格的左上角(1,1) 走到右下角(m, n).网格中的一些格子是空地(用0表示),其他格子是障碍(用1表示).机器人每次可以往4个方向走一格,但不能连续地穿越k( ...

  2. 洛谷P1126机器人搬重物[BFS]

    题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格,有些格子为不可移动的障碍.机 ...

  3. BFS 巡逻机器人

    巡逻机器人 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83498#problem/F 题目大意: 机器人在一个矩形区域巡逻, ...

  4. UVA 1600 Patrol Robot(机器人穿越障碍最短路线BFS)

    UVA 1600 Patrol Robot   Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu   ...

  5. 巡逻机器人(BFS)

    巡逻机器人问题(F - BFS,推荐) Description   A robot has to patrol around a rectangular area which is in a form ...

  6. 机器人搬重物(BFS)

    机器人搬重物 时间限制: 1 Sec  内存限制: 128 MB提交: 22  解决: 10[提交][状态][讨论版] 题目描述 机 器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一 ...

  7. UVA Planning mobile robot on Tree树上的机器人(状态压缩+bfs)

    用(x,s)表示一个状态,x表示机器人的位置,s表示其他位置有没有物体.用个fa数组和act数组记录和打印路径,转移的时候判断一下是不是机器人在动. #include<bits/stdc++.h ...

  8. [Bzoj3205][Apio2013]机器人(斯坦纳树)(bfs)

    3205: [Apio2013]机器人 Time Limit: 15 Sec  Memory Limit: 128 MBSubmit: 977  Solved: 230[Submit][Status] ...

  9. 【HIHOCODER 1575】 两个机器人(BFS)

    描述 一个N × M的2D迷宫中有两个机器人.机器人A在迷宫左上角,只能向右或向下移动:机器人B在迷宫右下角,只能向左或向上移动.机器人不能移动到迷宫外.此外,由于奇怪的同步机制,这两个机器人只能同时 ...

随机推荐

  1. codevs 1422 河城荷取

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 在幻想乡,河城荷取是擅长高科技工业的河童.荷取的得意之作除了光学迷彩外,还有 ...

  2. 利用Jenkins打包ISO和QCOW2镜像文件

    现在的云虚拟化环境越来越多,经常会碰到需要修改并重新打包新的ISO或QCOW2镜像文件.通过手工的方式会比较麻烦,所以在镜像发布的生产环境中可以利用Jenkins来进行定期打包发布,以下介绍Jenki ...

  3. webpack打包 css文件里面图片路径 替换位置

    { test: /\.css$/, use: ExtractTextPlugin.extract({ use: ['css-loader?minimize', 'autoprefixer-loader ...

  4. 把特征网络换成resnet-50

    从RFCN来看,Resnet-50和Resnet-101到最后一层卷积都是缩小到原来尺寸的16分之一,并且都用的7x7的格子去roi pooling. 看paper可以知道:resnet-50核心是由 ...

  5. zabbix监控流程图

  6. java对比IO和NIO的文件读写性能测试

    1. NIO采用更接近操作系统执行IO的方式:通道和缓存器:顾名思义,数据源的数据由缓存器通过通道进行传输. 2. 在JDK5之后,原始IO系统底层用NIO进行了优化,这可以通过sun公布的源码中找到 ...

  7. JavaScript中通过原型添加方法,解决数据共享问题,节省内存空间

    涉及知识点:(1)原型的引入(2)构造函数.原型对象和实例对象之间的关系(3)__proto__和prototype的理解 直接举例:在自定义构造函数创建对象时,因为创建的对象使用的不是同一个方法,所 ...

  8. 秋招复习-C++(三)

    • 数据库 1.数据库的索引有哪些? (1)B树索引:利用B树作为底层数据结构的索引,在B树索引中保存索引列的值和数据表的对应行的ID,每一个叶子结点都存放着一个索引列的值和数据表对应行的ID,通过这 ...

  9. 洛谷p1049 01背包

    dp水之旅背包 题目描述 有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30,每个物品有一个体积(正整数). 要求n个物品中,任取若干个装入箱 ...

  10. 【模板】插头dp

    题目描述 题解: 插头$dp$中经典的回路问题. 首先了解一下插头. 一个格子,上下左右四条边对应四个插头.就像这样: 四个插头. 一个完整的哈密顿回路,经过的格子一定用且仅用了两个插头. 所以所有被 ...