双端队列的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;
}

posted @ 2025-10-12 16:40  江蝶  阅读(3)  评论(0)    收藏  举报