bfs变种-游戏

题目大意:

  小明在玩一个电脑游戏,游戏在一个n×m的方格图上进行,小明控制的角色开始的时候站在第一行第一列,目标是前往第n行第m列。
  方格图上有一些方格是始终安全的,有一些在一段时间是危险的,如果小明控制的角色到达一个方格的时候方格是危险的,则小明输掉了游戏,如果小明的角色到达了第n行第m列,则小明过关。第一行第一列和第n行第m列永远都是安全的。
  每个单位时间,小明的角色必须向上下左右四个方向相邻的方格中的一个移动一格。
  经过很多次尝试,小明掌握了方格图的安全和危险的规律:每一个方格出现危险的时间一定是连续的。并且,小明还掌握了每个方格在哪段时间是危险的。
  现在,小明想知道,自己最快经过几个时间单位可以达到第n行第m列过关。

啊,这个时间就很搞人,想到就简单,想不到就烦死,反正我是bfs了半天,发现不好搞,看到别人的题解才发现可以用三维来表示状态是否被搜过,第三维是时间。这样就变成bfs模板题了。

代码:

#include <iostream>
#include <cstring>
#include <map>
#include <algorithm>
#include <queue>
using namespace std;
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
int vi[310][310][310];
int main(){
    int n,m,t;
    cin>>n>>m>>t;
    for(int i=0;i<t;i++){
        int r,c,a,b;
        cin>>r>>c>>a>>b;
        for(int j=a;j<=b;j++){
            vi[r][c][j]=1;
        }
    }
    queue<pair<pair<int,int>,int>>q;
    q.push(make_pair(make_pair(1,1),0));
    vi[1][1][0]=1;
    int res=-1;
    while(q.size()){
        pair<int,int> t=q.front().first;
        int l=q.front().second;
        q.pop();
        int x=t.first;
        int y=t.second;
        if(x==n&&y==m){
            res=l;
            break;
        }
        for(int i=0;i<4;i++){
            int nx=x+dx[i];
            int ny=y+dy[i];
            int nl=l+1;
            if(nx>=1&&nx<=n&&ny>=1&&ny<=m){
                if(vi[nx][ny][nl])continue;
                vi[nx][ny][nl]=1;
                q.push(make_pair(make_pair(nx,ny),nl));
            }
        }
    }
    cout<<res<<endl;
}

 

posted @ 2020-08-22 21:50  kstranger  阅读(178)  评论(0)    收藏  举报