標準寬搜
#include<stdio.h>
#include<queue>
using namespace std;
int m,n,m1,n1;
int dir[8][2];
int map[50][50];
int sx,sy;
int ans[50][50];
int vis[50][50];
bool fun(int x,int y)
{
if(x>=1&&x<=m&&y>=1&&y<=n)return true;
return false;
}
void bfs()
{
queue<int>X;
queue<int>Y;
X.push(sx);
Y.push(sy);
vis[sx][sy]=1;
ans[sx][sy]=0;
while(!X.empty())
{
int ux=X.front();
int uy=Y.front();
X.pop();
Y.pop();
if(map[ux][uy]==4)
{
printf("%d",ans[ux][uy]);
return ;
}
for(int i=0;i<8;i++)
{
int vx=ux+dir[i][0];
int vy=uy+dir[i][1];
if(!vis[vx][vy]&&(map[vx][vy]==1||map[vx][vy]==4)&&fun(vx,vy))
{
vis[vx][vy]=1;
ans[vx][vy]=ans[ux][uy]+1;
X.push(vx);
Y.push(vy);
}
}
}
}
int main()
{
// freopen("bronlily.in","r",stdin);
// freopen("bronlily.out","w",stdout);
scanf("%d %d %d %d",&m,&n,&m1,&n1);
dir[0][0]=m1,dir[0][1]=n1;
dir[1][0]=m1,dir[1][1]=-n1;
dir[2][0]=-m1,dir[2][1]=n1;
dir[3][0]=-m1,dir[3][1]=-n1;
dir[4][0]=n1,dir[4][1]=m1;
dir[5][0]=n1,dir[5][1]=-m1;
dir[6][0]=-n1,dir[6][1]=m1;
dir[7][0]=-n1,dir[7][1]=-m1;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&map[i][j]);
if(map[i][j]==3)
{
sx=i,sy=j;
}
}
}
bfs();
}