骑士

题目

骑士
难度级别: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;
}
作者:18西斯光剑
出处:https://www.cnblogs.com/DARTH-VADER-EMPIRE/
Copyright ©2018-2020 18西斯光剑
All Rights Reserved.
原文地址:https://www.cnblogs.com/DARTH-VADER-EMPIRE/p/9499856.html