题目大意:
求任给一正方棋盘上,骑士(knight)从一点上跳到另一点,最少的步数。
解:
水题。很基本的BFS,POJ上好多类似的题。如2488(a knight's journey)。
为了节省时间,手动用数组模拟的队列。但是数组大小不太好判断,暂时只能开的比较大。如果数据规模太大,可能必须要用STL了。
代码大部分篇幅用来写当前点到下一个点的选择,有些繁琐,有待优化。
时间比较慢,93ms,暂时还没想出怎么优化。
代码:
#include<iostream>
using namespace std;
int ex,ey;
bool s[310][310];
struct P{
int x,y,num;
}q[1000000];
int main()
{
int times;
cin>>times;
while(times--)
{
memset(s,0,sizeof(s));
int an=0,l,sx,sy;
cin>>l>>sx>>sy>>ex>>ey;
int front=1,rear=2;
q[1].x=sx;
q[1].y=sy;
q[1].num=0;
while(front<rear)
{
P temp=q[front];
if(s[temp.x][temp.y]==1)
{
++front;
continue;
}
s[temp.x][temp.y]=1;
if(temp.x==ex&&temp.y==ey)
{
an=temp.num;
break;
}
if(temp.x-2>=0&&temp.y-1>=0&&s[temp.x-2][temp.y-1]==0)
{
q[rear].x=temp.x-2;
q[rear].y=temp.y-1;
q[rear++].num=temp.num+1;
}
if(temp.x-1>=0&&temp.y-2>=0&&s[temp.x-1][temp.y-2]==0)
{
q[rear].x=temp.x-1;
q[rear].y=temp.y-2;
q[rear++].num=temp.num+1;
}
if(temp.x+1<=l-1&&temp.y-2>=0&&s[temp.x+1][temp.y-2]==0)
{
q[rear].x=temp.x+1;
q[rear].y=temp.y-2;
q[rear++].num=temp.num+1;
}
if(temp.x+2<=l-1&&temp.y-1>=0&&s[temp.x+2][temp.y-1]==0)
{
q[rear].x=temp.x+2;
q[rear].y=temp.y-1;
q[rear++].num=temp.num+1;
}
if(temp.x+2<=l-1&&temp.y+1<=l-1&&s[temp.x+2][temp.y+1]==0)
{
q[rear].x=temp.x+2;
q[rear].y=temp.y+1;
q[rear++].num=temp.num+1;
}
if(temp.x+1<=l-1&&temp.y+2<=l-1&&s[temp.x+1][temp.y+2]==0)
{
q[rear].x=temp.x+1;
q[rear].y=temp.y+2;
q[rear++].num=temp.num+1;
}
if(temp.x-1>=0&&temp.y+2<=l-1&&s[temp.x-1][temp.y+2]==0)
{
q[rear].x=temp.x-1;
q[rear].y=temp.y+2;
q[rear++].num=temp.num+1;
}
if(temp.x-2>=0&&temp.y+1<=l-1&&s[temp.x-2][temp.y+1]==0)
{
q[rear].x=temp.x-2;
q[rear].y=temp.y+1;
q[rear++].num=temp.num+1;
}
++front;
}
cout<<an<<endl;
}
system("PAUSE");
return 0;
}