洛谷: P1443 马的遍历

devtools/2025/4/1 5:30:18/

原题地址:P1443 马的遍历 - 洛谷

题目描述

有一个 n×m 的棋盘,在某个点 (x,y) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。

输入格式

输入只有一行四个整数,分别为 n,m,x,y。

输出格式

一个 n×m 的矩阵,代表马到达某个点最少要走几步(不能到达则输出 −1)。

        该题可以用bfs广度优先搜索遍历来解决,因为广度优先遍历可以保证第一次访问某一个节点时得到的结果就是最短路径,完美的符合该题的题意。可以用stl类中的queue容器。即动态扩容的队列,可以有效地避免数组开的过大或过小,而发生错误。并且不能用延迟标记的方法,要立即标记当前的状态。我第一次就是用的延迟标记的方法,但是最后会超出队列的内存限制,再请教了deepseek之后,才了解到了延迟标记和立即标记的具体区别.

这也让我长见识了 。

具体代码如下:

#include <iostream>
#include <queue>
using namespace std;//每个结构体包含当前点的坐标以及到达该店所需要的步数
struct node{int a,b,step;
};int row,col;
int grid[405][405];
//马走日的八个方向
int dict[8][2] = {{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1},{-2,1},{-1,2},{1,2}};void bfs(int x,int y){//queue可以动态的分配内存,否则的话容易栈溢出queue<node> q;q.push({x,y,0});grid[x][y] = 0;while (!q.empty()){node qq = q.front();q.pop();int xx = qq.a;int yy = qq.b;int s = qq.step;for (int i = 0;i < 8;++i){int ix = xx + dict[i][0];int iy = yy + dict[i][1];if (ix >= 1 && ix <= row && iy >= 1 && iy <= col && grid[ix][iy] == -1){//立刻标记状态,如果使用延迟标记的话会进行重复入队的操作,会超出内存限制grid[ix][iy] = s + 1;q.push({ix,iy,s + 1});}}}
}
int main()
{int x,y;cin>>row>>col>>x>>y;for (int i = 1;i <= row;++i){for (int j = 1;j <= col;++j){grid[i][j] = -1;}}bfs(x,y);for (int i = 1;i <= row;++i){for (int j = 1;j <= col;++j){printf("%-3d  ",grid[i][j]);}cout<<endl;}return 0;
}


http://www.ppmy.cn/devtools/171369.html

相关文章

html和css 实现元素顺时针旋转效果(椭圆形旋转轨迹)

一 实现效果 二 实现代码 我自己是用react写的。 1. react 代码如下&#xff1a; import React from "react"; import styles from "./index.less";export default () > {return <div className{styles.containers}><div className{styles.c…

MySQL:数据库基础

数据库基础 1.什么是数据库&#xff1f;2.为什么要学习数据库&#xff1f;3.主流的数据库&#xff08;了解&#xff09;4.服务器&#xff0c;数据库&#xff0c;表之间的关系5.数据的逻辑存储6.MYSQL架构7.存储引擎 1.什么是数据库&#xff1f; 数据库(Database,简称DB)&#x…

RabbitMQ的高级特性介绍(二)

发送方确认 当消息的⽣产者将消息发送出去之后&#xff0c;消息到底有没有正确地到达服务器呢? 如果在消息到 达服务器之前已经丢失(比如RabbitMQ重启, 那么RabbitMQ重启期间⽣产者消息投递失败), 持久化操作也解决不了这个问题&#xff0c;因为消息根本没有到达服务器&#…

物联网系统部署与运维实训室

一、引言 在数字化时代&#xff0c;物联网技术正以前所未有的速度蓬勃发展&#xff0c;广泛渗透到各个领域&#xff0c;深刻改变着人们的生活和工作方式。从智能家居、智能交通到工业自动化、医疗健康等&#xff0c;物联网的应用无处不在&#xff0c;推动着各行业的智能化变革…

“零拷贝”(Zero-Copy)技术详解以及使用场景

“零拷贝”(Zero-Copy)是一种优化数据传输效率的技术,通过减少或消除数据在内存中的复制次数,显著提高I/O操作性能。以下是使用Java代码实现的零拷贝技术示例。 Java NIO 中的零拷贝实现 1. 内存映射文件(Memory Mapped File) import java.io.IOException; import jav…

工作记录 2017-03-07

工作记录 2017-03-07 序号 工作 相关人员 1 修改邮件上的问题。 更新RD服务器。 郝 更新的问题 1、增加了2个菜单Global Fee Category、Global Fee List。 2、增加了Global Fee Category页面。 3、增加了Global Fee List页面。 我在把邮件上的文件生成导入数据库…

硬件基础(5):(3)二极管的应用

文章目录 [toc]1. **整流电路****功能**&#xff1a;**工作原理**&#xff1a;**应用实例**&#xff1a;电路组成&#xff1a;整流过程&#xff1a;电路的应用&#xff1a; 2. **稳压电路****功能**&#xff1a;**工作原理**&#xff1a;**应用实例**&#xff1a;电路组成及功能…

提升生产效率的关键: ethercat转TCPIP网关智能通信

大家好。最近在数据互联互通方面&#xff0c;我们迎来了一个重要的突破。作为生产管理系统的核心组成部分&#xff0c;数据互联互通一直是一个亟待解决的挑战。我们知道&#xff0c;EtherCAT和TCP/IP是两种不同的通信协议&#xff0c;它们之间的互通性一直存在问题。 不过&…