nyoj 1022 最少步数【优先队列+广搜】
最少步数
时间限制:3000 ms | 内存限制:65535 KB
难度:4
- 描述
-
这有一个迷宫,有0~8行和0~8列:
1,1,1,1,1,1,1,1,1
1,0,0,1,0,0,1,0,1
1,0,0,1,1,0,0,0,1
1,0,1,0,1,1,0,1,1
1,0,0,0,0,1,0,0,1
1,1,0,1,0,1,0,0,1
1,1,0,1,0,1,0,0,1
1,1,0,1,0,0,0,0,1
1,1,1,1,1,1,1,1,10表示道路,1表示墙。
现在输入一个道路的坐标作为起点,再如输入一个道路的坐标作为终点,问最少走几步才能从起点到达终点?
(注:一步是指从一坐标点走到其上下左右相邻坐标点,如:从(3,1)到(4,1)。)
- 输入
- 第一行输入一个整数n(0<n<=100),表示有n组测试数据;
随后n行,每行有四个整数a,b,c,d(0<=a,b,c,d<=8)分别表示起点的行、列,终点的行、列。 - 输出
- 输出最少走几步。
- 样例输入
-
2 3 1 5 7 3 1 6 7
- 样例输出
-
12 11
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374#include<stdio.h>
#include<string.h>
#include<queue>
using
namespace
std;
int
visit[9][9];
int
map[9][9]={
1,1,1,1,1,1,1,1,1,
1,0,0,1,0,0,1,0,1,
1,0,0,1,1,0,0,0,1,
1,0,1,0,1,1,0,1,1,
1,0,0,0,0,1,0,0,1,
1,1,0,1,0,1,0,0,1,
1,1,0,1,0,1,0,0,1,
1,1,0,1,0,0,0,0,1,
1,1,1,1,1,1,1,1,1,
};
struct
node
{
int
x;
int
y;
int
step;
friend
bool
operator <(node a,node b)
//结构体设置优先队列优先级
{
return
a.step>b.step;
//步数小的先出队列
}
};
void
bfs(
int
x1,
int
y1,
int
x2,
int
y2)
{
int
ok=0,i,k;
int
move[4][2]={0,-1,0,1,-1,0,1,0};
//用以在四个方向上的移动
node begin,end;
//定义结构体变量
priority_queue<node>q;
//设置一个结构体的优先队列
begin.x=x1;
begin.y=y1;
begin.step=0;
q.push(begin);
//进队
while
(!q.empty())
//判断队列是否为空 如果不为空(即不到终点)则一直循环
{
end=q.top();
q.pop();
//删除队首元素
if
(end.x==x2&&end.y==y2)
//判断是否搜索到终点
{
ok=1;
break
;
}
for
(i=0;i<4;i++)
//对此点四个方向进行搜索
{
begin.x=end.x+move[i][0];
begin.y=end.y+move[i][1];
if
(!visit[begin.x][begin.y]&&0<=begin.x&&begin.x<9&&0<=begin.y&&begin.y<9&&map[begin.x][begin.y]==0)
{
//判断路是否通并且判断当前点是否在题目所给的范围内
visit[begin.x][begin.y]=1;
begin.step=end.step+1;
//步数加一
q.push(begin);
//将最小步数的一组放入队首
}
}
}
if
(ok)
printf
(
"%d\n"
,end.step);
else
printf
(
"-1\n"
);
}
int
main()
{
int
n,m,j,i,s,t,x1,y1,x2,y2;
scanf
(
"%d"
,&n);
while
(n--)
{
scanf
(
"%d%d%d%d"
,&x1,&y1,&x2,&y2);
memset
(visit,0,
sizeof
(visit));
bfs(x1,y1,x2,y2);
}
return
0;
}
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· 一个基于 .NET 开源免费的异地组网和内网穿透工具
· 《HelloGitHub》第 108 期
· Windows桌面应用自动更新解决方案SharpUpdater5发布
· 我的家庭实验室服务器集群硬件清单