专题一搜索 B - Knight Moves
- 题目描述
原题来自:POJ 1915
编写一个程序,计算一个骑士从棋盘上的一个格子到另一个格子所需的最小步数。骑士一步可以移动到的位置由下图给出。
输入格式第一行给出骑士的数量 nn。
在接下来的 3n3n 行中,每 33 行描述了一个骑士。其中,- 第一行一个整数 LL 表示棋盘的大小,整个棋盘大小为 L\times LL×L;
- 第二行和第三行分别包含一对整数 (x,y)(x,y),表示骑士的起始点和终点。假设对于每一个骑士,起始点和终点均合理。
对每一个骑士,输出一行一个整数表示需要移动的最小步数。如果起始点和终点相同,则输出 00。
样例数据范围与提示Input Output 3 8 0 0 7 0 100 0 0 30 50 10 1 1 1 1
5 28 0
对于 100\%100% 的数据,有 4\le L\le 3004≤L≤300,保证 0\le x,y\le L-10≤x,y≤L−1。
- 思路
广搜样板题,不细说了 - 代码
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
using
namespace
std;
int
t,n,sx,sy,ex,ey,nx,ny;
int
vis[333][333];
int
step[333][333];
int
main()
{
scanf
(
"%d"
,&t);
for
(
int
i=0;i<t;i++)
{
scanf
(
"%d%d%d%d%d"
,&n,&sx,&sy,&ex,&ey);
queue<
int
>qx,qy;
qx.push(sx),qy.push(sy);
vis[sx][sy]=1;
step[sx][sy]=0;
while
(!qx.empty()&&!qy.empty())
{
nx=qx.front(),qx.pop();
ny=qy.front(),qy.pop();
if
(nx==ex&&ny==ey)
{
break
;
}
if
(nx-2>=0&&ny+1<=n&&vis[nx-2][ny+1]==0)
{
qx.push(nx-2);
qy.push(ny+1);
step[nx-2][ny+1]=step[nx][ny]+1;
vis[nx-2][ny+1]=1;
}
if
(nx-2>=0&&ny-1>=0&&vis[nx-2][ny-1]==0)
{
qx.push(nx-2);
qy.push(ny-1);
step[nx-2][ny-1]=step[nx][ny]+1;
vis[nx-2][ny-1]=1;
}
if
(nx-1>=0&&ny+2<=n&&vis[nx-1][ny+2]==0)
{
qx.push(nx-1);
qy.push(ny+2);
step[nx-1][ny+2]=step[nx][ny]+1;
vis[nx-1][ny+2]=1;
}
if
(nx-1>=0&&ny-2>=0&&vis[nx-1][ny-2]==0)
{
qx.push(nx-1);
qy.push(ny-2);
step[nx-1][ny-2]=step[nx][ny]+1;
vis[nx-1][ny-2]=1;
}
if
(nx+1<=n&&ny+2<=n&&vis[nx+1][ny+2]==0)
{
qx.push(nx+1);
qy.push(ny+2);
step[nx+1][ny+2]=step[nx][ny]+1;
vis[nx+1][ny+2]=1;
}
if
(nx+2<=n&&ny+1<=n&&vis[nx+2][ny+1]==0)
{
qx.push(nx+2);
qy.push(ny+1);
step[nx+2][ny+1]=step[nx][ny]+1;
vis[nx+2][ny+1]=1;
}
if
(nx+2<=n&&ny-1>=0&&vis[nx+2][ny-1]==0)
{
qx.push(nx+2);
qy.push(ny-1);
step[nx+2][ny-1]=step[nx][ny]+1;
vis[nx+2][ny-1]=1;
}
if
(nx+1<=n&&ny-2>=0&&vis[nx+1][ny-2]==0)
{
qx.push(nx+1);
qy.push(ny-2);
step[nx+1][ny-2]=step[nx][ny]+1;
vis[nx+1][ny-2]=1;
}
}
memset
(vis,0,
sizeof
(vis));
printf
(
"%d\n"
,step[ex][ey]);
}
return
0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!