zoukankan      html  css  js  c++  java
  • 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;
        }
    }
    


  • 相关阅读:
    elasticsearch
    Python数据预处理(sklearn.preprocessing)—归一化(MinMaxScaler),标准化(StandardScaler),正则化(Normalizer, normalize)
    Pandas的Categorical Data
    详解FindBugs的各项检测器 .
    Oracle存储过程基本语法介绍
    关于MySQL的SLEEP(N)函数
    MYSql存储过程的作用及语法
    唯一约束 和 唯一索引 有什么区别?
    MySql避免重复插入记录
    [Ljava.lang.String和java.lang.String区别
  • 原文地址:https://www.cnblogs.com/yezekun/p/3925822.html
Copyright © 2011-2022 走看看