如果把cout<<-1<<endl;
改成cout<<8<<endl;
就可以了,但我想知道为什么,求救QAQ
#include<bits/stdc++.h>
using namespace std;
int n,m,xf,yf,d[20]={1,2,4,8,16,32,64,128,256,512,-1,-2,-4,-8,-16,-32,-64,-128,-256,-512};
char a[1010][1010];
bool used[1010][1010];
struct sb
{
int x,y,ce;
}s,q[10000001];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
if(a[i][j]=='#')
{
xf=i;
yf=j;
}
}
}
int maxx=9;
int f=0,e=1;
s.x=1;
s.y=1;
s.ce=0;
q[++f]=s;
used[1][1]=1;
while(f>=e)
{
sb u=q[e++];
for(int j=0;j<=19;j++)
{
sb v=u;
bool flag=0;
v.x+=d[j];
v.ce++;
if(v.x<1||v.y<1||v.x>n||v.y>m)
{
continue;
}
if(used[v.x][v.y])
{
continue;
}
for(int k=u.x;k!=v.x;k+=d[j]/abs(d[j]))
{
if(a[k][v.y]=='X')
{
flag=1;
break;
}
}
if(flag)
{
continue;
}
if(v.x==xf&&v.y==yf)
{
cout<<v.ce<<endl;
return 0;
}
q[++f]=v;
used[v.x][v.y]=1;
}
for(int j=0;j<=19;j++)
{
sb v=u;
bool flag=0;
v.y+=d[j];
v.ce++;
if(v.x<1||v.y<1||v.x>n||v.y>m)
{
continue;
}
if(used[v.x][v.y])
{
continue;
}
for(int k=u.y;k!=v.y;k+=d[j]/abs(d[j]))
{
if(a[v.x][k]=='X')
{
flag=1;
break;
}
}
if(flag)
{
continue;
}
if(v.x==xf&&v.y==yf)
{
cout<<v.ce<<endl;
return 0;
}
q[++f]=v;
used[v.x][v.y]=1;
}
}
cout<<-1<<endl;
return 0;
}