栈或者是队列要开的大一些,之前开小了,总是Runtime error.
单独设置一个距离函数,用于保存步数,最先找到的肯定是最小的。
附上代码:
#include<stdio.h>
#include<string.h>
#define N 300
int x1,x2,x3,x4,m;
int front,rear;
int mov[8][2]={{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1},{-2,1},{-1,2}};
int vis[N][N],dis[N][N];
struct point
{
int x;
int y;
}node[90010];
void bfs(int x,int y)
{
int i,j,k,n1,n2,tx,ty;
int front=0,rear=0;
vis[x][y]=1;
node[rear].x=x;
node[rear].y=y;
dis[x][y]=0;
rear++;
while(front<rear)
{
n1=node[front].x;
n2=node[front].y;
if(n1==x3&&n2==x4)
{
break;
}
front++;
for(i=0;i<8;i++)
{
tx=n1+mov[i][0];
ty=n2+mov[i][1];
if(tx>=0&&tx<m&&ty>=0&&ty<m&&!vis[tx][ty])
{
vis[tx][ty]=1;
node[rear].x=tx;
node[rear].y=ty;
dis[tx][ty]=dis[n1][n2]+1;
rear++;
}
}
}
}
int main()
{
int i,j,k,n;
scanf("%d",&n);
while(n--)
{
scanf("%d",&m);
scanf("%d%d%d%d",&x1,&x2,&x3,&x4);
memset(vis,0,sizeof(vis));
memset(dis,0,sizeof(dis));
bfs(x1,x2);
printf("%d\n",dis[x3][x4]);
}
return 0;
}