原题链接
#include<iostream>
#include<algorithm>
#include<string.h>
#include<queue>
#include<vector>
#include<stack>
#define x first
#define y second
using namespace std;
const int N=555;
typedef long long ll;
typedef pair<int,int> PII;
int n,m;
int ddx[30],ddy[30];//存放当前点不能以0花费到达时广搜的方向
int dx[]={0,0,-1,1},dy[]={-1,1,0,0};
struct Node
{
int x,y,val;
bool operator <(Node r)const
{
return val>r.val;//优先遍历值更小的
}
};
typedef struct Node node;
int g[N][N];
int d[N][N];
void bfs()
{
memset(d,0x3f,sizeof d);
priority_queue<node> q;
q.push({1,1,0});
d[1][1]=0;
while(q.size())
{
auto t=q.top();
q.pop();
for(int i=0;i<4;i++){
int a=t.x+dy[i],b=t.y+dx[i];
if(a<1||b<1||a>n||b>m||g[a][b])continue;
if(t.val<d[a][b]){
d[a][b]=t.val;
q.push({a,b,t.val});
}
}
for(int i=1;i<25;i++)
{
if(abs(ddx[i])+abs(ddy[i])==4)continue;//不合法
/*
x***x
*****
**o** o为当前点,*为o点进行一次操作能到到达的地方(d[o]+1=d[*])
*****
x***x
*/
if(ddx[i]==0&&ddy[i]==0)continue;
int a=t.x+ddy[i],b=t.y+ddx[i];
if(a<1||b<1||a>n||b>m)continue;
if(d[a][b]>1+t.val){
d[a][b]=t.val+1;
q.push({a,b,d[a][b]});
}
}
}
}
void solve()
{
int r=0;
for(int i=1;i<=5;i++)for(int j=1;j<=5;j++){
ddx[r]=i-3;ddy[r++]=j-3;
}
// cout<<r<<"\n";
cin>>n>>m;
char c;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)cin>>c,g[i][j]=(c=='#'?1:0);
bfs();
cout<<d[n][m]<<"\n";
return ;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int T=1;
//cin>>T;
while(T--)
{
solve();
}
return 0;
}