zoukankan      html  css  js  c++  java
  • poj 1475 (bfs+bfs)

    bfs套一个bfs

    先bfs box的移动情况,这里注意的是可能一个坐标x,ybox多次经过是可行的。网上的很多AC代码就没注意这个。比如下面这组数据:

    8 9
    #########
    #......T#
    #.S.....#
    ##B######
    #.......#
    #.......#
    #.......#
    #########

    网上很多AC代码输出“Impossible.”明显错的。。。

    然后在每次bfs box的时候bfs person 判断是否能走到相应的点。(即相反的方向点)

    最后还注意的是 Output a single blank line after each test case. 如果最后没有空行竟然是报wa的。。。

    View Code
      1 #include <iostream>
      2 #include <cstring>
      3 #include <cstdio>
      4 #include <algorithm>
      5 #include <queue>
      6 #include <string>
      7 
      8 using namespace std;
      9 
     10 #define MAXN 22
     11 char P[4]={'N','S','W','E'};
     12 char M[4]={'n','s','w','e'};
     13 int R,C;
     14 int dir[4][2]={-1,0,1,0,0,-1,0,1};
     15 char map[MAXN][MAXN];
     16 struct point
     17 {
     18     int x,y;
     19     int p_x,p_y;//当前状态person所在的地方
     20     string ans;
     21 };
     22 bool isok(int x,int y)
     23 {
     24     if(x>=0 && x<R && y>=0 && y<C && map[x][y] != '#')
     25         return true;
     26     return false;
     27 }
     28 string tmp;
     29 bool bfs_person(point en,point cu)
     30 {
     31     tmp="";
     32     point st;
     33     st.x=en.p_x;
     34     st.y=en.p_y;
     35     st.ans="";
     36     queue<point>q;
     37     bool vis[MAXN][MAXN];
     38     memset(vis,0,sizeof(vis));
     39     while(!q.empty())
     40         q.pop();
     41     q.push(st);
     42     while(!q.empty())
     43     {
     44         point cur,next;
     45         cur=q.front();
     46         q.pop();
     47         if(cur.x==en.x && cur.y==en.y)
     48         {
     49             tmp=cur.ans;
     50             return true;
     51         }
     52         for(int i=0;i<4;i++)
     53         {
     54             next=cur;
     55             next.x=cur.x+dir[i][0];
     56             next.y=cur.y+dir[i][1];
     57             if(!isok(next.x,next.y)) continue;
     58             if(next.x==cu.x && next.y==cu.y) continue;
     59             if(vis[next.x][next.y]) continue;
     60             vis[next.x][next.y]=1;
     61             next.ans=cur.ans+M[i];
     62             q.push(next);
     63         }
     64     }
     65     return false;
     66 }
     67 string bfs_box()
     68 {
     69     bool vis[MAXN][MAXN][4];//某点四个方向是否访问!!0==N,1==S,2==W,3==E
     70     point st;
     71     st.x=st.y=-1;
     72     st.p_x=st.p_y=-1;
     73     st.ans="";
     74     for(int i=0;i<R && (st.x==-1 || st.p_x==-1);i++)
     75         for(int j=0;j<C && (st.x==-1 || st.p_x==-1);j++)
     76             if(map[i][j]=='B')
     77             {
     78                 st.x=i;
     79                 st.y=j;
     80                 map[i][j]='.';
     81             }
     82             else if(map[i][j]=='S')
     83             {
     84                 st.p_x=i;
     85                 st.p_y=j;
     86                 map[i][j]='.';
     87             }
     88     //----------------------------------------
     89     //cout<<"st.x="<<st.x<<" st.y="<<st.y<<" st.p_x="<<st.p_x<<" st.p_y="<<st.p_y<<endl;
     90     //----------------------------------------
     91     queue<point> q;
     92     while(!q.empty())
     93         q.pop();
     94     q.push(st);
     95     memset(vis,0,sizeof(vis));
     96     while(!q.empty())
     97     {
     98         point cur=q.front();q.pop();    
     99         //----------------------------------------
    100     //        cout<<"cur.x="<<cur.x<<" cur.y="<<cur.y<<" cur.p_x="<<cur.p_x<<" cur.p_y="<<cur.p_y<<endl;
    101     //    cout<<"-----------------------------\n";
    102         //----------------------------------------
    103         point next,pre;
    104         if(map[cur.x][cur.y]=='T')
    105             return cur.ans;
    106         for(int i=0;i<4;i++)
    107         {
    108             next=cur;
    109             next.x=cur.x+dir[i][0];
    110             next.y=cur.y+dir[i][1];
    111             if(!isok(next.x,next.y))
    112                 continue;
    113             if(vis[next.x][next.y][i])
    114                 continue;
    115             pre=cur;
    116             switch(i)
    117             {
    118                 case 0: pre.x=cur.x+1;break;
    119                 case 1: pre.x=cur.x-1;break;
    120                 case 2: pre.y=cur.y+1;break;
    121                 case 3: pre.y=cur.y-1;break;
    122             }
    123             if(!bfs_person(pre,cur))//搜寻人是否能走到特定的位置
    124                 continue;
    125             vis[next.x][next.y][i]=1;
    126             next.ans=cur.ans+tmp;
    127             next.ans=next.ans+P[i];
    128             next.p_x=cur.x;next.p_y=cur.y;
    129             q.push(next);
    130         }
    131     }
    132     return "Impossible.";
    133 }
    134 
    135 int main()
    136 {
    137     int cas=1;
    138     while(scanf("%d%d",&R,&C) && (R+C))
    139     {
    140         getchar();
    141         for(int i=0;i<R;i++)
    142             gets(map[i]);
    143 
    144         //---------------------------------------
    145     //    for(int i=0;i<R;i++)
    146         //    cout<<map[i]<<endl;
    147         //----------------------------------------
    148 
    149         printf("Maze #%d\n",cas++);
    150         //printf("%s\n",bfs_box());
    151         cout<<bfs_box()<<endl<<endl;
    152     }
    153     return 0;
    154 }
  • 相关阅读:
    PHP实现无限极分类
    html2canvas生成并下载图片
    一次线上问题引发的过程回顾和思考,以更换两台服务器结束
    Intellij IDEA启动项目报Command line is too long. Shorten command line for XXXApplication or also for
    mq 消费消息 与发送消息传参问题
    idea 创建不了 java 文件
    Java switch 中如何使用枚举?
    Collections排序
    在idea 设置 git 的用户名
    mongodb添加字段和创建自增主键
  • 原文地址:https://www.cnblogs.com/Missa/p/2714435.html
Copyright © 2011-2022 走看看