题意:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/53b3a1430b52bfb6e860b02f406312ef.png)
解法:
bfs,队列维护节点位置(x,y)以及左右走的次数(l,r),
即(x,y,l,r).
但是bfs到同一个节点,有可能(l,r)不同,
此时如果l+r比原先更少,那么入队覆盖,继续bfs.
ps:
一个性质是同一个节点的左右位移距离r-l是相同的.
code:
#include <bits/stdc++.h>
using namespace std;
const int maxm=2e3+5;
char s[maxm][maxm];
int n,m,r,c,X,Y;
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
struct Node{
int x,y,l,r;
};
int sum[maxm][maxm];
void bfs(){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
sum[i][j]=-1;
}
}
queue<Node>q;
q.push({r,c,0,0});
sum[r][c]=0;
while(q.size()){
Node t=q.front();q.pop();
for(int i=0;i<4;i++){
int x=t.x+dx[i];
int y=t.y+dy[i];
if(x<1||x>n||y<1||y>m)continue;
if(s[x][y]=='*')continue;
int l1=t.l;
int r1=t.r;
if(i==0)r1++;
else if(i==1)l1++;
if(l1>X||r1>Y)continue;
if(sum[x][y]!=-1&&l1+r1>=sum[x][y])continue;
sum[x][y]=l1+r1;
q.push({x,y,l1,r1});
}
}
}
void solve(){
cin>>n>>m>>r>>c>>X>>Y;
for(int i=1;i<=n;i++){
cin>>(s[i]+1);
}
bfs();
int ans=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(sum[i][j]!=-1){
ans++;
}
}
}
cout<<ans<<endl;
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);
solve();
return 0;
}