poj 1376 Robot

来源:互联网 发布:工程设计优化方法手段 编辑:程序博客网 时间:2024/05/18 14:46
#include<iostream>
#include<queue>#include <cstdlib>#include <stdio.h>#include<string.h>#define N 55#define MAX 0x7fffffffusing namespace std;typedef struct                                     {         int x,y;           int step;    //步数        int dir;     //该Point的当前方向}Point;Point s,e;          //s:起点   e:终点int map[N][N],vis[N][N];int used[N][N][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;} 
原创粉丝点击