不知道为什么对着题解看了几遍只有28,实在调不出来了
题面:
https://www.xinyoudui.com/ac/contest/7740019400006B3045C4416/problem/8836
窝的代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1005;
int n,m,sx,sy;
int lr[N][N],ud[N][N],dist[N][N];
int dx[]={1,-1,0,0},dy[]={0,0,1,-1};
char ar[N][N];
void bfs(){
memset(dist,0x3f,sizeof dist);
queue<pair<int,int> >q;
q.push({1,1});
dist[1][1]=0;
while(!q.empty()){
pair<int,int>head=q.front();
int x=head.first,y=head.second;
q.pop();
for(int i=0;i<4;i++){
for(int j=1;j<=1000;j*=2){
int _x=x+dx[i]*j,_y=y+dy[i]*j;
if(_x<1||_y<1||_x>n||_y>m)continue;
if(x!=_x&&abs(ud[_x][_y]-ud[x][y]))break;
if(y!=_y&&abs(lr[_x][_y]-lr[x][y]))break;
if(dist[_x][_y]>dist[x][y]+1){
dist[_x][_y]=dist[x][y]+1;
q.push({_x,_y});
}
}
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>ar[i][j];
if(ar[i][j]=='X')lr[i][j]=ud[i][j]=1;
if(ar[i][j]=='#')sx=i,sy=j;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
lr[i][j]+=lr[i][j-1];
ud[i][j]+=ud[i-1][j];
}
}
bfs();
if(dist[sx][sy]>1e9)cout<<-1;
else cout<<dist[sx][sy];
return 0;
}