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; }

浙公网安备 33010602011771号