求助……
  • 板块学术版
  • 楼主liufukang
  • 当前回复5
  • 已保存回复5
  • 发布时间2020/12/27 16:22
  • 上次更新2023/11/5 05:35:56
查看原帖
求助……
139509
liufukang楼主2020/12/27 16:22

这题之前做过,手打的队列BFS,最近学queue又拿出来做结果TLE……

题面:

农夫Somurolov认为自己是最厉害的棋手,他能让骑士从一个位置最快速地移动到另一个位置,不过做为一名会搜索算法的程序萌手,必然不能认输,现在你就写编写一个程序,找到骑士从一个位置移动到另外一个位置的最小步数,从而打败Somurolov。棋盘上的骑士移动如下图所示: logo

输入:

第一行一个数n,表示有多组数据。接下来的每组数据包括三行:

第一行为一个数m(4≤m≤300),表示棋盘的长和宽,显然这里是一个正方形的棋盘;

第二、三行各有两个数,表示起点位置和终点位置,当然这两个位置都应该在棋盘内。

你可以假定所有数据都是有效的,即起点一定能到达终点。

输出:

对于每组数据,输出从起点到终点的最少移动步数,如果起点和终点相同,则输出0。

样例输入:

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

样例输出:

5
28
0

我的代码:

#include<bits/stdc++.h>
using namespace std;
const int dx[8]={-1,-2,-2,-1,1,2,2,1};
const int dy[8]={-2,-1,1,2,2,1,-1,-2};
struct Node{
	int x,y;
};
queue<Node>q;
int d[310][310];
int bfs();
int n,m,X,Y,X1,Y1;
int main()
{
	cin>>n;
	while (n--){//多组数据
		cin>>m;
		while (!q.empty()) q.pop();//队列初始化
		memset(d,0,sizeof(d));//标记初始化
		cin>>X>>Y;//起始点读入
		cin>>X1>>Y1;//目标点读入
		if (X==X1&&Y==Y1){
			cout<<0<<endl;
			continue;
		}//判断是否已在目标点
		bfs();
	}
	return 0;
}
int bfs(){
	q.push({X,Y});//起始点压入
	while (!q.empty()){
		Node tmp=q.front(); q.pop();
		bool pd=0;
		for (int i=0;i<8;i++){
			int x1=tmp.x+dx[i];
			int y1=tmp.y+dy[i];//位置转换
			if (d[x1][y1]&&x1>=0&&y1>=0&&x1<m&&y1<m) continue;//判断是否走过或越界
			d[x1][y1]=d[tmp.x][tmp.y]+1;
			if (x1==X1&&y1==Y1){
				cout<<d[x1][y1]<<endl;
				pd=1;
				break;
			}//如果到达就输出,退出搜索
			q.push({x1,y1});//压入新点
		}
		if (pd) break;
	}
}

求大佬神助……

2020/12/27 16:22
加载中...