您的位置:首页 > 其它

poj 1376 Robot

2012-04-15 17:41 295 查看
#include<iostream>
#include<queue>
#include <cstdlib>
#include <stdio.h>
#include<string.h>
#define N 55
#define MAX 0x7fffffff
using namespace std;
typedef struct
{
int x,y;
int step;    //步数
int dir;     //该Point的当前方向
}Point;
Point s,e;          //s:起点   e:终点
int map

,vis

;
int used

[4];                      //之前从起点到当前点(x,y)的步数
int d[4][2]={0,1,1,0,0,-1,-1,0};                      //四个方向,右、下、左、上
int n,m;
bool ok(int x,int y,Point cur)            //判断(x,y)是否可以走
{
return x>0&&x<n&&y>0&&y<m&&cur.step+1<used[x][y][cur.dir];   //如果(x,y)在坐标中,且当前走到该点的路径比之前的短则可走
}

int bfs()                                        //广搜
{
Point cur,next;
queue<Point> q;
while(!q.empty()) q.pop();
q.push(s);
while (!q.empty())
{
cur=q.front();
q.pop();
if(cur.x==e.x&&cur.y==e.y)                     //如果当前节点为终点,结束
return cur.step;
if (cur.step+1<used[cur.x][cur.y][(cur.dir+1)%4])        //如果到了当前路径到了该点,向右转,其中used[][][]存的
//实际上是上一次到达这点且也是面向当前右转,即两次状态一致,且这一次的路径更短
{
next=cur;
next.step++;
next.dir=(cur.dir+1)%4;
q.push(next);
used[cur.x][cur.y][(cur.dir+1)%4]=cur.step;
}
if(cur.step+1<used[cur.x][cur.y][(cur.dir+4-1)%4])         //与上面内容相似,但是是当前方向向左转
{
next=cur;
next.step++;
next.dir=(cur.dir+4-1)%4;
q.push(next);
used[cur.x][cur.y][(cur.dir+4-1)%4]=cur.step;
}
for(int i=1;i<4;i++)                                      //当前位置(如果要转方向,则转弯方向后),向此时面对的方向前走1、2、3步
{
int nx,ny;
nx=cur.x+i*d[cur.dir][0];
ny=cur.y+i*d[cur.dir][1];
if(map[nx][ny]==1)  break;
if (ok(nx,ny,cur))
{
next.x=nx;
next.y=ny;
next.step=cur.step+1;
next.dir=cur.dir;
q.push(next);                               //将当前点入队列
used[nx][ny][next.dir]=next.step;
}
}
}
return -1;
}

int main(int argc, char** argv)
{
char str[10];
while (scanf("%d%d",&n,&m)!=EOF&&n!=0&&m!=0)
{
memset(map,0,sizeof(map));
for (int i=0;i<n;i++)
{
for (int j=0;j<m;j++)
{
int temp;
scanf("%d",&temp);                            //若该格子为黑,则将格子四个点的坐标赋值为1
if (temp==1)
{
map[i][j]=map[i][j+1]=map[i+1][j]=map[i+1][j+1]=1;      //将格子化为点的坐标来做。

}
used[i][j][0]=used[i][j][1]=used[i][j][2]=used[i][j][3]=MAX;
}
}
scanf("%d%d%d%d",&s.x,&s.y,&e.x,&e.y);
scanf("%s",str);
if(strcmp(str,"east")==0)  s.dir=0;
else if(strcmp(str,"south")==0)  s.dir=1;
else if(strcmp(str,"west")==0)  s.dir=2  ;
else s.dir=3;
s.step=0;
printf("%d\n",bfs());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: