poj1376 bfs,机器人

开始时候有点怕, 感觉什么也不会,不过静下来思考思考也就想出来了,一个简单的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;
    }
}


原文地址:https://www.cnblogs.com/yezekun/p/3925822.html