就是bfs罢了,一定要注意及时标记走过的位置!!!不然会超时,芜湖~~~我就是这么寄掉的😭
#include<bits/stdc++.h>
using namespace std;
typedef struct{
int x,y,z;
}node;
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
int a[1010][1010];//0是墙,1是空地
bool vis[1010][1010];
int n,ans=-1;
void bfs()
{
queue<node>q;
node cur;
q.push({1,1,0});
vis[1][1]=1;
while(q.size())
{
cur=q.front();
q.pop();
if(cur.x==n&&cur.y==n){
ans=cur.z; break;
}
for(int i=0;i<4;i++)
{
int nx,ny;
nx=cur.x+dx[i],ny=cur.y+dy[i];
if(!a[nx][ny])
while(a[nx-dx[i]][ny-dy[i]]){
nx-=dx[i],ny-=dy[i];
}
if(vis[nx][ny]==false&&a[nx][ny])
{
q.push({nx,ny,cur.z+1});
vis[nx][ny]=1;//确定可走后,赶紧标记了,防止后面再被标记到,以免超时
}
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
cin>>a[i][j]; a[i][j]^=1;
}
bfs();
cout<<ans;
}
24/8/12