题目
| 骑士 |
| 难度级别:C; 运行时间限制:1000ms; 运行空间限制:128000KB; 代码长度限制:2000000B |
|
试题描述
|
|
骑士的行走方式类似于象棋中的马,现在给你一个任务,计算骑士从一点到另一点所需的最少步数。 |
|
输入
|
|
第一行给出骑士的数量n。对于每一个骑士都有3行,第一行一个整数L,表示棋盘的大小(4<=L<=300),整个棋盘大小为LxL(坐标范围为0...L);第二行和第三行分别包含一对整数(xy),表示骑士的起始点和终点。假设,对于每一个骑士起始点和终点均合理。
|
|
输出
|
|
对每一个骑士输出一行,一个整数表示需要移动的最少步数。如果起始点和终点相同,则输出0。
|
|
输入示例
|
|
3
8
0 0
7 0
100
0 0
30 50
10
1 1
1 1
|
|
输出示例
|
|
5
28
0
|
分析
前面一直在发简单题,终于,在同学的劝说下,发一道符合自己当前水平的题。
前方高能,新手慎入!!!
先来分析一下,这道无比坑人的题。
坑人点:
1.每组样例含多组数据,每算完一组数据,就要把变量都清零。
2.每次搜八个方向,容易搞乱。
3.用到队列。
刚刚有说用到队列,那咱们先来科普一下有关队列的一些用法:
q.front()//当前队列无队首。 q.push()//元素入队。 q.pop()//元素出队。 q.empty()//当前为空队。 queue<int>//队列定义队列元素,只有这样定义的变量才能进行以上操作。
队列的基本用法了解了,下面来写题。
代码很长,小心很多错误。这题我写就写了一天,上午写BUG,下午DEBUG……
代码
#include<bits/stdc++.h>
using namespace std;
int step[305][305],ans[305],n,px,py,qx,qy,sx,sy,ex,ey,l;
bool flag[305][305];
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
queue<int> qx,qy;
scanf("%d%d%d%d%d",&l,&sx,&sy,&ex,&ey);
qx.push(sx);
qy.push(sy);
flag[sx][sy]=1;
step[sx][sy]=0;
while(!qx.empty()&&!qy.empty())
{
px=qx.front();
qx.pop();
py=qy.front();
qy.pop();
if(px==ex&&py==ey)
{
ans[i]=step[px][py];
break;
}
if(px-2>=0&&py+1<=l&&flag[px-2][py+1]==0)
{
qx.push(px-2);
qy.push(py+1);
step[px-2][py+1]=step[px][py]+1;
flag[px-2][py+1]=1;
}
if(px-1>=0&&py+2<=l&&flag[px-1][py+2]==0)
{
qx.push(px-1);
qy.push(py+2);
step[px-1][py+2]=step[px][py]+1;
flag[px-1][py+2]=1;
}
if(px+1<=l&&py+2<=l&&flag[px+1][py+2]==0)
{
qx.push(px+1);
qy.push(py+2);
step[px+1][py+2]=step[px][py]+1;
flag[px+1][py+2]=1;
}
if(px+2<=l&&py+1<=l&&flag[px+2][py+1]==0)
{
qx.push(px+2);
qy.push(py+1);
step[px+2][py+1]=step[px][py]+1;
flag[px+2][py+1]=1;
}
if(px-2>=0&&py-1>=0&&flag[px-2][py-1]==0)
{
qx.push(px-2);
qy.push(py-1);
step[px-2][py-1]=step[px][py]+1;
flag[px-2][py-1]=1;
}
if(px-1>=0&&py-2>=0&&flag[px-1][py-2]==0)
{
qx.push(px-1);
qy.push(py-2);
step[px-1][py-2]=step[px][py]+1;
flag[px-1][py-2]=1;
}
if(px+1<=l&&py-2>=0&&flag[px+1][py-2]==0)
{
qx.push(px+1);
qy.push(py-2);
step[px+1][py-2]=step[px][py]+1;
flag[px+1][py-2]=1;
}
if(px+2<=l&&py-1>=0&&flag[px+2][py-1]==0)
{
qx.push(px+2);
qy.push(py-1);
step[px+2][py-1]=step[px][py]+1;
flag[px+2][py-1]=1;
}
}
memset(flag,0,sizeof(flag));
while(!qx.empty()&&!qy.empty())
{
qx.pop();
qy.pop();
}
}
for(int i=0;i<n;i++) printf("%d
",ans[i]);
return 0;
}