题意:在一个迷宫中,向左向右的走动的距离是固定的,向上向下的可以随意走动,问最多可以走多少步;
这个题目不能直接BFS因为有可能在某一行,会先走到左右限制的边缘这样可能就没办法往下走了,怎么办呢,用双端队列,队首存前后,队尾存左右走的步,这样就可以尽量的向上下走,会走的最多。
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int n,m,r,c,x,y;
struct node{
int x,y,l,r;
};
int dx[5]={0,0,1,-1},dy[5]={1,-1,0,0};
int d[]={1,0,-1,0,0,1,0,-1};
int vis[2010][2010];
char map[2010][2010];
void bfs(){
deque<node> q;
q.push_back(node{r,c,0,0});
vis[r][c]=1;
while(!q.empty()){
node k=q.front();
q.pop_front();
// cout<<k.x<<" "<<k.y<<endl;
for(int i=0;i<4;i++){
int xx=k.x+d[i],yy=k.y+d[i+4];
int ll,rr;
ll=k.l+(i==3);rr=k.r+(i==1);
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&map[xx][yy]!='*'&&!vis[xx][yy]&&ll<=x&&rr<=y){
vis[xx][yy]=1;
if(i&1)
q.push_back(node{xx,yy,ll,rr});
else
q.push_front(node{xx,yy,ll,rr});
}
}
}
}
int main(){
cin>>n>>m;
cin>>r>>c;
cin>>x>>y;
for(int i=1;i<=n;i++){
cin>>map[i]+1;
}
// for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++){
// cout<<map[i][j];
// }
// cout<<endl;
// }
memset(vis,0,sizeof(vis));
int cnt=0;
bfs();
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cnt+=vis[i][j];
}
// cout<<endl;
}
cout<<cnt<<endl;
}