MLE40pts求调+玄关。
查看原帖
MLE40pts求调+玄关。
1200401
wnqnld_llx楼主2025/7/23 16:16

record

#include<bits/stdc++.h>
#define int long long
using namespace std;
int h,w,d,r;
char a[1001][1001];
int dis[1001][1001][2];
bool vis[1001][1001][2];
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
struct node{
	int x,y,used;
};
void bfs(){
	queue <node> q;
	q.push({1,1,0});
	dis[1][1][0]=0;
	while(q.size()){
		node now=q.front();
		q.pop();
		int x=now.x,y=now.y,z=now.used;
		vis[x][y][z]=1;
		for(int i=0;i<4;i++){
			int lx=x+dx[i],ly=y+dy[i];
			if(!vis[lx][ly][z]&&a[lx][ly]=='.'&&lx>=1&&lx<=h&&ly>=1&&ly<=w){
				q.push({lx,ly,z});
				dis[lx][ly][z]=min(dis[x][y][z]+1,dis[lx][ly][z]);
			}
		}
		if(!z&&a[x+d][y+r]=='.'&&x+d>=1&&x+d<=h&&y+r>=1&&y+r<=w&&!vis[x+d][y+r][z]){
			dis[x+d][y+r][1]=min(dis[x][y][0]+1,dis[x+d][y+r][1]);
			q.push({x+d,y+r,1});
		}
	}
}
signed main(){
	cin>>h>>w>>d>>r;
	for(int i=1;i<=h;i++){
		for(int j=1;j<=w;j++) cin>>a[i][j];
	}
	for(int i=1;i<=h;i++){
		for(int j=1;j<=w;j++){
			dis[i][j][1]=dis[i][j][0]=INT_MAX;
		}
	}
	bfs();
	int ans=min(dis[h][w][1],dis[h][w][0]);
	if(ans==INT_MAX) cout<<-1;
	else cout<<ans;
	return 0;
}
2025/7/23 16:16
加载中...