题目
思路
一眼bfs
好像需要记录的东西有点多啊,那就交给数组吧
s
t
i
j
0
/
1
st_{ij0/1}
stij0/1表示用/没用特殊步走到(i,j)的步数,然后套bfs模板即可
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1005;
int n,m,d,r,st[N][N][2];
char s[N][N];
struct Point{
int x,y,u;
};
queue<Point> Q;
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
bool check(int x,int y) { return x>=1&&x<=n&&y>=1&&y<=m&&s[x][y]=='.'; }
int main()
{
cin>>n>>m>>d>>r;
for(int i=1;i<=n;i++) cin>>s[i]+1;
memset(st,-1,sizeof(st));//没有到达的状态初始-1
st[1][1][0]=0;
Q.push({1,1,0});
while(!Q.empty()&&st[n][m][0]==-1&&st[n][m][1]==-1){
Point now=Q.front();Q.pop();
for(int i=0;i<4;i++){
int x=now.x+dx[i],y=now.y+dy[i];
if(check(x,y)&&st[x][y][now.u]==-1){
Q.push({x,y,now.u});
st[x][y][now.u]=st[now.x][now.y][now.u]+1;
if(!now.u&&check(x+d,y+r)&&st[x+d][y+r][1]==-1){
Q.push({x+d,y+r,1});
st[x+d][y+r][1]=st[x][y][0]+1;
}
}
}
}
if(st[n][m][0]==-1&&st[n][m][1]==-1) cout<<-1;
else cout<<min(st[n][m][0]==-1?1<<30:st[n][m][0],st[n][m][1]==-1?1<<30:st[n][m][1]);
return 0;
}
end
完结撒花