题目链接:TZOJ:7536A Maze Game
题面:
样例输入1:
4 5
3 2
1 2
.....
.***.
...**
*....
样例输出1:
10
CF原题。双端队列板子题把。(没学双端的最好先学了)
就是最短路的思想:把向左移和向右移都看成是权值为1的边,向上或向下移动权值为0.
那么可以发现这个图的权值只有0或者1。可以用双端队列来做。
如果向左或向右移,把点放到队列后边,向上或向下移动,把点放到队列前边。
#include <bits/stdc++.h>
using namespace std;
const int maxn=505;
struct Node{
int x,y;
int l,r;
};
char s[maxn][maxn];
bool flag[maxn][maxn];
int dir[4][2]={1,0,-1,0,0,1,0,-1};
int n,m;
int S,T;
int sl,sr;
bool judge(int x,int y){
if(!flag[x][y]&&x>=1&&x<=n&&y>=1&&y<=m&&s[x][y]!='*') return true;
return false;
}
int bfs(){
deque<Node> dq;
dq.push_back({S,T,sl,sr});
int ans=0;
while(dq.size()){
Node tmp=dq.front();
dq.pop_front();
int x=tmp.x,y=tmp.y,l=tmp.l,r=tmp.r;
if(flag[x][y]) continue;
flag[x][y]=true;
ans++;
for(int i=0;i<4;i++){
int px=x+dir[i][0];
int py=y+dir[i][1];
if(!judge(px,py)) continue;
if(i==2&&r>0) dq.push_back({px,py,l,r-1});
else if(i==3&&l>0) dq.push_back({px,py,l-1,r});
else if(i==0||i==1) dq.push_front({px,py,l,r});
}
}
return ans;
}
int main(){
cin>>n>>m>>S>>T>>sl>>sr;
for(int i=1;i<=n;i++) cin>>s[i]+1;
cout<<bfs()<<endl;
}