#include
#include
const int inf=1000000;
const int MAX=1005;
using namespace std;
typedef struct node
{
int x,y;
int step;
friend bool operator<(const struct node &n1,const struct node &n2)
{
return n1.step>n2.step;
}
}N;
char map[MAX][MAX];
bool visited[MAX][MAX];
int dir[8][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};
int n,m;
int vst[MAX][MAX];
void init()
{
memset(visited,false,sizeof(visited));
for(int i=0;iQ;
pre.x=sx;
pre.y=sy;
pre.step=0;
vst[pre.x][pre.y]=0;
Q.push(pre);
if(sx==ex && sy==ey)
return 0;
while(!Q.empty())
{
pre=Q.top();
Q.pop();
if(pre.x==ex && pre.y==ey)//终点
return pre.step;
for(int i=0;i<8;i++)
{
cur=pre;
cur.x+=dir[i][0];
cur.y+=dir[i][1];
if(visited[cur.x][cur.y]==false && cur.x>=1 && cur.x<=n && cur.y>=1 && cur.y<=m)
{
if(map[pre.x][pre.y]!=i+'0')
cur.step++;
//visited[cur.x][cur.y]=true;
if(vst[cur.x][cur.y]>cur.step)
{
vst[cur.x][cur.y]=cur.step;
Q.push(cur);
}
}
}
}
return -1;
}
int main(void)
{
while(scanf("%d%d",&n,&m)==2)
{
init();
int i,j;
for(i=1;i<=n;i++)
{
scanf("%s",map[i]+1);
}
int num,sx,sy,ex,ey;
scanf("%d",&num);
for(i=1;i<=num;i++)
{
scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
int ans=BFS(sx,sy,ex,ey);
printf("%d\n",ans);
}
}
return 0;
} ;i++)>
相关文章: