救救孩子吧!!!悬关
  • 板块学术版
  • 楼主yjjh
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/5/17 13:27
  • 上次更新2024/5/17 17:52:38
查看原帖
救救孩子吧!!!悬关
1036002
yjjh楼主2024/5/17 13:27

题目:

输入n代表有个n×n的棋盘,输入开始位置的坐标和结束位置的坐标,问一个骑士朝棋盘的八个方向走马字步,从开始坐标到结束坐标可以经过多少步。

输入描述

首先输入一个n,表示测试样例的个数。

每个测试样例有三行。

第一行是棋盘的大小L(4≤L≤300);

第二行和第三行分别表示马的起始位置和目标位置(0..L−1)。

输出描述

马移动的最小步数,起始位置和目标位置相同时输出0。

用例输入 1

3 8 0 0 7 0 100 0 0 30 50 10 1 1 1 1

用例输出 1

5 28 0

我的代码:

#include <bits/stdc++.h>
using namespace std;
struct Z{
	int x,y,s;
};
const int N=1e6;
Z q[N],a,b;
int main(){
	int dx[8]={1,-1,1,-1,2,2,-2,-2};
	int dy[8]={2,2,-2,-2,1,-1,1,-1};
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		memset(q,0,sizeof(q));
		int l,f=1,e=0;
		scanf("%d%d%d%d%d",&l,&a.x,&a.y,&b.x,&b.y);
		if(a.x==b.x&&a.y==b.y){
			printf("0\n");
			goto brea;
		}
		e++;
		q[e]=a;
		while(f<=e){
			Z u=q[f];
			for(int i=0;i<8;i++){
			    Z v;
				if(u.x+dx[i]<0||u.x+dx[i]>=l||u.y+dy[i]<0||u.y+dy[i]>=l)continue;
			    v.x=u.x+dx[i];
				v.y=u.y+dy[i];
				v.s=u.s+1;
			    if(b.x==v.x&&b.y==v.y){
			    	printf("%d\n",v.s);
			    	goto brea;
				}
			    e++;
			    q[e]=v;
	    	}
	    	f++;
		}
		brea:;
	}
	return 0;
}
不知道为什么,RE了,帮帮孩子吧
2024/5/17 13:27
加载中...