相应的问题所在:http://acm.pku.edu.cn/JudgeOnline/problem?id=1915
C语言版实现算法如下:
#include<stdio.h>
int tu[1000][1000];
int head,tail,count,m,flag=0,EndX,EndY;
struct save {
int x;
int y;
}data[900000];
void DFS( int x, int y,int times) // x,y当前所在位置的步数, times 走到当前位置所走的步数;
{
if(x==EndX&&y==EndY)
{
flag=1;
return;
}
if(x-2>=0&&y+1<m&&tu[x-2][y+1]==-1)//向右上方
{
data[tail].x=x-2;
data[tail].y=y+1;//进队列
tu[x-2][y+1]=times+1;
tail++;
}
if(x-2>=0&&y-1<m&&tu[x-2][y-1]==-1)//向左上方
{
data[tail].x=x-2;
data[tail].y=y-1;//进队列
tu[x-2][y-1]=times+1;
tail++;
}
if(x-1>=0&&y+2<m&&tu[x-1][y+2]==-1)//向右偏上方
{
data[tail].x=x-1;
data[tail].y=y+2;//进队列
tu[x-1][y+2]=times+1;
tail++;
}
if(x-1>=0&&y-2<m&&tu[x-1][y-2]==-1)//向左偏上方
{
data[tail].x=x-1;
data[tail].y=y-2;//进队列
tu[x-1][y-2]=times+1;
tail++;
}
if(x+2>=0&&y+1<m&&tu[x+2][y+1]==-1)//向右下方
{
data[tail].x=x+2;
data[tail].y=y+1;//进队列
tu[x+2][y+1]=times+1;
tail++;
}
if(x+2>=0&&y-1<m&&tu[x+2][y-1]==-1)//向左下方
{
data[tail].x=x+2;
data[tail].y=y-1;//进队列
tu[x+2][y-1]=times+1;
tail++;
}
if(x+1>=0&&y+2<m&&tu[x+1][y+2]==-1)//向右偏下方
{
data[tail].x=x+1;
data[tail].y=y+2;//进队列
tu[x+1][y+2]=times+1;
tail++;
}
if(x+1>=0&&y-2<m&&tu[x+1][y-2]==-1)//向左偏下方
{
data[tail].x=x+1;
data[tail].y=y-2;//进队列
tu[x+1][y-2]=times+1;
tail++;
}
}
main()
{
int n,i,j,x,y;
scanf("%d",&n);
while(n!=0)
{
head=0;
tail=0;
count=0;
flag=0;
scanf("%d",&m);
for(i=0;i<m;i++)
for(j=0;j<m;j++)
tu[i][j]=-1;
scanf("%d%d",&x,&y);
tu[x][y]=0;
scanf("%d%d",&EndX,&EndY);
data[tail].x=x;
data[tail].y=y;
tail++;
while(tail>head&&flag!=1) //当队列不为空且没有找到目的点;
{
DFS(data[head].x,data[head].y,tu[data[head].x][data[head].y]); //从当前点开始进行广度遍历;
if(flag==1)
{
count=tu[EndX][EndY];
printf("%d\n",count); // 直到找到目的点后输出步数;
break;
}
head++;
}
n--;
}
return 0;
}
通过二维数组,队列等存储结构完成图的广度遍历功能。