题目链接
题目大意:
一个H×W大小的矩阵,其中'.'代表路,'#'代表墙壁,有两种移动方式一是沿着路一格一格走,二是以当前格为中心,走到5×5正方形中的任何一个路,问你从出发地到目的地至少要用第二种方式走几步?
解题思路:
abc的场E比D简单多了,这题花了我好久的时间才写出来主要就是麻烦,分两次BFS,一次是第一种方式,一次是第二种方式。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#define pb emplace_back
#define LOCAL
using namespace std;
const int mod = 1e9+7;
const int inf = 0x3f3f3f3f;
const int maxn = 1e5+5;
typedef long long ll;
typedef pair<int,int> Pii;
template <typename T>inline void read(T& t){
char c=getchar();t=0;
int f=1;
while(!isdigit(c)){
if(c=='-')f=-1;
c=getchar();
}
while(isdigit(c))t=t*10+c-48,c=getchar();
t=f*t;
}
template <typename T,typename... Args> inline void read(T& t,Args&... args){
read(t);read(args...);
}
char maze[1005][1005];
int vis[1005][1005];
int c1,c2,d1,d2;
queue<Pii> q[2];
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
int main(){
int t=1;
while(t--){
int h,w;
read(h,w);
read(c1,c2,d1,d2);
for(int i=0;i<=h+1;i++){
for(int j=0;j<=w+1;j++){
maze[i][j]='#';
}
}
for(int i=1;i<=h;i++){
scanf("%s",maze[i]+1);
}
bool flag=true;
vis[c1][c2]=1;
int x=0,ans=0;
q[x].push(Pii(c1,c2));
while(1){
while(!q[x].empty()){
Pii now=q[x].front();
q[x^1].push(now);
q[x].pop();
for(int i=0;i<4;i++){
int tx=now.first+dx[i];
int ty=now.second+dy[i];
if(!vis[tx][ty]&&maze[tx][ty]=='.'){
q[x].push(Pii(tx,ty));
q[x^1].push(Pii(tx,ty));
vis[tx][ty]=1;
}
}
}
if(vis[d1][d2]){
break;
}
x^=1;
ans++;
while(q[x].size()){
Pii now=q[x].front();
q[x].pop();
for(int i=-2;i<=2;i++){
for(int j=-2;j<=2;j++){
int tx=now.first+i;
int ty=now.second+j;
if(tx<0||tx>h)continue;
if(ty<0||ty>w)continue;
if(!vis[tx][ty]&&maze[tx][ty]=='.'){
q[x^1].push(Pii(tx,ty));
vis[tx][ty]=1;
}
}
}
}
if(vis[d1][d2]){
break;
}
x^=1;
if(q[x].empty()){
flag=false;
break;
}
}
if(!flag){
puts("-1");
break;
}
printf("%d\n",ans);
}
return 0;
}