题目
骑士 |
难度级别: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; }