双端队列的0-1BFS
问题:
B. Labyrinth
代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
#define fi first
#define se second
#define vi vector<int>
#define vll vector<long long>
#define pii pair<int,int>
#define endl '\n'
#define MOD 1000000007
const int N=2e5+5,INF=1e18;
void solve(){
int n,m,r,c,x,y;
cin>>n>>m>>r>>c>>x>>y;
vector<string>g(n);
for(int i=0;i<n;i++) cin>>g[i];
int sr=r-1,sc=c-1;
vector<vi>dist(n,vi(m,INF));
deque<pii>dq;
dist[sr][sc]=0;
dq.emplace_front(sr,sc);
int dr[4]={-1,1,0,0};//左右上下
int dc[4]={0,0,1,-1};
while(!dq.empty()){
auto [i,j]=dq.front();
dq.pop_front();
int cur=dist[i][j];
for(int k=0;k<4;k++){
int ni=i+dr[k],nj=j+dc[k];
if(ni<0||ni>=n||nj<0||nj>=m) continue;
if(g[ni][nj]=='*') continue;
int add=(k==3)?1:0;
if(cur+add<dist[ni][nj]){
dist[ni][nj]=cur+add;
if(add==0) dq.emplace_front(ni,nj);
else dq.emplace_back(ni,nj);
}
}
}
int ans=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(dist[i][j]==INF) continue;
int L=dist[i][j];
int cd=j-sc;
int R=L+cd;
if(L<=x&&R>=0&&R<=y) ans++;
}
}
cout<<ans<<endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
int T=1;
// cin>>T;
while(T--)
solve();
return 0;
}

浙公网安备 33010602011771号