【usaco2010】ice大bfs解题

不管题目是什么,反正是道bfs的题.

大概题目就是说,给出一个初始局面,其中'B'表示Bessie,'G'表示终点位置,'*'表示石头,'.'表示冰块.

然后若Bessie的4个方向上,有一块紧贴着她的石头,她就可以从当前点开始选一个方向推一次石头划到底(有一块石头挡住她的路),问她最少要推几次石头.

这道题不难,直接用bfs即可.

过程中先用一个set来判重,set中存一个pair类型表示坐标.

那么我们用一个结构体node来表示Bessie当前所在的位置,然后开一个queue不断跑就行了.

不过有一个难点,如何快速查找从一个点朝一个方向滑走后的第一块石头.

我们就可以直接用两个map来记录,一个是横方向,一个是纵方向.

然后分别嵌入一个set来保存.

那就可以快速查询了,具体看代码注释.

这题完全没有华容道丧病啊...

扫描二维码关注公众号,回复: 1881217 查看本文章

代码如下:

#include<bits/stdc++.h>
  using namespace std;
typedef long long LL;
#define ACF inline void
#define lb lower_bound
const int mod=2323237;
const int N=20000;
struct node{
  int x,y,step;
};
set < pair < int , int > > s;
queue < node > q;
map < int , set < int > > xy;
map < int , set < int > > yx;
int sx,sy,fx,fy,n;
ACF into(){
  scanf("%d%d%d%d%d",&n,&sx,&sy,&fx,&fy);
  int x,y;
  for (int i=1;i<=n;i++){
    scanf("%d%d",&x,&y);
    yx[x].insert(y);
    xy[y].insert(x);
  }
}
int bfs(){
  q.push((node){sx,sy,0});
  set< int > t;
  node k;
  set< int > :: iterator it;
  s.insert((pair <int , int > ){sx,sy});
  if (sx==fx&&sy==fy) return 0;
  while (!q.empty()){
    k=q.front();
    t=yx[k.x];
    it=t.lb(k.y);
    if (it!=t.end()&&*it-1>k.y&&!s.count((pair< int , int >){k.x,*it-1})){
      if (k.x==fx&&*it-1==fy) return k.step+1;
      s.insert((pair<int , int>){k.x,*it-1});
      q.push((node){k.x,*it-1,k.step+1});
    }
    if (it!=t.begin()&&*(--it)+1<k.y&&!s.count((pair< int , int >){k.x,*it+1})){
      if (k.x==fx&&*it+1==fy) return k.step+1;
      s.insert((pair< int , int >){k.x,*it+1});
      q.push((node){k.x,*it+1,k.step+1});
    }
    t=xy[k.y];
    it=t.lb(k.x);
    if (it!=t.end()&&*it-1>k.x&&!s.count((pair< int , int >){*it-1,k.y})){
      if (k.y==fy&&*it-1==fx) return k.step+1;
      s.insert((pair< int , int >){*it-1,k.y});
      q.push((node){*it-1,k.y,k.step+1});
    }
    if (it!=t.begin()&&*(--it)+1<k.x&&!s.count((pair< int , int >){*it+1,k.y})){
      if (k.y==fy&&*it+1==fx) return k.step+1;
      s.insert((pair< int , int >){*it+1,k.y});
      q.push((node){*it+1,k.y,k.step+1});
    }
    q.pop();
  }
}
ACF work(){
}
ACF outo(){
  printf("%d\n",bfs());
}
int main(){
  into();
  work();
  outo();
}

猜你喜欢

转载自blog.csdn.net/hzk_cpp/article/details/80778194