这个题是牛客周赛上的一道题
题目链接

思路
当时比赛的时候我就想起用BFS写但没有思路,然后看了别人写的才知道,就是我们一开始可以先把数组处理一下让数组异或1,异或之后0就变成可以走的路,1就变成了墙和边界,然后我们就正常的按BFS套路走,在每一个位置都遍历上下左右四个方向,如果遇见1就回溯直到再遇见下一个位置是1的点,如果这个点没有被遍历过就入队,直到找到(n,n)就行了。
代码
#include <bits/stdc++.h>
#define lowbit(x) ((x)&(-x))
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;
int s[1010][1010],n,st[1010][1010],f=0;
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
typedef pair<int,int>PII;
queue<PII>q;
void bfs(int x,int y)
{
st[x][y]=0;
q.push({x,y});
while(q.size())
{
PII t=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int a=t.first+dx[i],b=t.second+dy[i];
if(s[a][b]==0)
{
while(s[a-dx[i]][b-dy[i]])
a-=dx[i],b-=dy[i];
}
if(st[a][b]>-1)continue;
q.push({a,b});
st[a][b]=st[t.first][t.second]+1;
if(a==n&&b==n)
{
f=1;break;
}
}
if(f==1)
break;
}
}
signed main()
{
IOS
int T=1;
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
cin>>s[i][j],s[i][j]^=1;
}
memset(st,-1,sizeof st);
bfs(1,1);
if(f==0)
cout<<-1<<endl;
else
cout<<st[n][n]<<endl;
return 0;
}