开始时候有点怕, 感觉什么也不会,不过静下来思考思考也就想出来了,一个简单的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. js dom node.children与node.childNodes区别

    不同点:node.children不会取到节点下面的TextNode但是node.childNodes会取到 共同点:两者都是集合类数组,可以通过索引的方式取到值也可以用for循环遍历

  2. The Performance Manifesto

    Manifesto For Performance Testing And Engineering We choose to support others in their quest for bet ...

  3. Javaweb学习笔记7—JDBC技术

      今天来讲javaweb的第7阶段学习. JDBC技术,关于JDBC本篇博客只介绍了它的一部分,后面博客会更加深入探讨. 老规矩,首先先用一张思维导图来展现今天的博客内容.   ps:我的思维是用的 ...

  4. javascript innerHTML 大数据量加载 导致IE 内存溢出 的解决办法

    在做 ajax 滚动加载的时候,越到后面 数据量越大,使用obj.innerHTML+=row添加到页面的时候,出现ie内存不足的情况,此时使用createDocumentFragment,创建一个文 ...

  5. ubuntu 18.04 start myproject

    #!/bin/bash now=$(date +%Y%m%d) cmd='/home/hu/go/src/github.com/coredns/coredns/coreserver -conf /ho ...

  6. js获取农历

    上一篇我们对upupoo网页壁纸改造时用到了农历,upupoo(网页壁纸)自主修改一:农历,这里记一下笔记: 获取当前农历的js 主js: //农历 var CalendarData=new Arra ...

  7. ios 自定义delegate(一)

    在自定义协议的头文件 .h中 @protocol NSDelegate <NSObject>@optional  //可选 - (void)OnOption:(NSString *)pSt ...

  8. Openjudge-4115-佐助和鸣人

    这一题是一道广搜的题目,首先我们通过读入字符串读入每一行,然后顺带找到鸣人的位置. 然后我们初始化之后,就进行广搜,还是广搜的格式,但是要压入队列的条件我们可以稍微变一变,我们可以直接判断下一个要走的 ...

  9. 深入Linux内核架构——锁与进程间通信

    Linux作为多任务系统,当一个进程生成的数据传输到另一个进程时,或数据由多个进程共享时,或进程必须彼此等待时,或需要协调资源的使用时,应用程序必须彼此通信. 一.控制机制 1.竞态条件 几个进程在访 ...

  10. cenos6.5作为网关

    入口服务器(网关服务器)关闭selinuxsetenforce 0vim /etc/selinux/config将SELINUX=enforcing改为SELINUX=disabled 修改防火墙ip ...