#include<bits/stdc++.h>
using namespace std;
int n,m;
struct node
{
int x,y;
};
int dx[]={1,2,4,8,16,32,64,128,256,512,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-2,-4,-8,-16,-32,-64,-128,-256,-512};
int dy[]={0,0,0,0,0,0,0,0,0,0,1,2,4,8,16,32,64,128,256,512,-1,-2,-4,-8,-16,-32,-64,-128,-256,-512,0,0,0,0,0,0,0,0,0,0};//预处理数组
queue<node>que;
int dis[1010][1010];
char a[1145][1419];
int h[1010][1010];
int z[1010][1010];
void bfs()//广搜
{
que.push({1,1});
while(!que.empty())
{
node u=que.front();
que.pop();
for(int i=0;i<40;i++)
{
int nx=u.x+dx[i],
ny=u.y+dy[i];
if(nx<1||nx>n||ny<1||ny>m)
{
continue;
}
if(a[nx][ny]=='X'||a[nx][ny]=='.')
{
continue;
}
int x=u.x,y=u.y;
if(nx!=x)//判断路径上是否有障碍
{
if(h[nx][ny]-h[x][y]!=0)
continue;
}
else
{
if(z[ny][nx]-z[y][nx]!=0)
continue;
}
if(dis[nx][ny]>dis[u.x][u.y]+1)
{
dis[nx][ny]=dis[u.x][u.y]+1;
que.push({nx,ny});
}
}
}
}
int main()
{
for(int i=1;i<=1000;i++)
{
for(int j=1;j<=1000;j++)
{
dis[i][j]=1000000000;
}
}//初始化
cin>>n>>m;
for(int i=1;i<=n;i++)
{
scanf("%s",a[i]+1);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
h[i][j]+=h[i][j-1];
h[i][j]+=((a[i][j]=='X'||a[i][j]=='.')?1:0);
}
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
z[j][i]+=z[j-1][i];
z[j][i]+=((a[j][i]=='X'||a[j][i]=='.')?1:0);
}
}//预处理障碍数组
dis[1][1]=0;
bfs();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i][j]=='#')
{
cout<<dis[i][j];//输出答案
exit(0);
}
}
}
return 0;
}
求助 dalao