hnust 1497: 中国象棋中的跳马问题

hnust 1497: 中国象棋中的跳马问题

题目描述
现在棋盘的大小不一定,由p,q给出,并且在棋盘中将出现障碍物(限制马的行动,与象棋走法相同)
输入
第一行输入n表示有n组测试数据。
每组测试数据第一行输入2个整数p,q,表示棋盘的大小(1<=p,q<=100)。
每组测试数据第二行输入4个整数,表示马的起点位置与终点位置。(位置的取值范围同p,q)
第三行输入m表示图中有多少障碍。
接着跟着m行,表示障碍的坐标。

输出
马从起点走到终点所需的最小步数。
如果马走不到终点,则输入“can not reach!”
样例输入 Copy
2
9 10
1 1 2 3
0
9 10
1 1 2 3
8
1 2
2 2
3 3
3 4
1 4
3 2
2 4
1 3
样例输出 Copy
1
can not reach!
提示
此题是一个搜索题,建议选择BFS(广搜)。一开始把马的起始点加入队列,然后用广搜的思想把此点能到达的其他点加入队列,这里需要一个数组用来记录此点在之前是否已经加入队列,如果加入过队列当中,就不需要再加入了,直到队列里的元素为空,或者搜索到了终点,搜索即停止,然后输出相应答案即可。

解题过程

这段C++代码实现了一个基于广度优先搜索(BFS)的算法,用于解决在一个棋盘上模拟“马走日”的路径搜索问题。以下是对代码的更详细解析:

1. 头文件和命名空间

  • 包含必要的头文件,提供输入输出、内存操作和队列功能。
  • 使用using namespace std;简化代码。

2. 全局变量定义

  • dir结构体数组D定义了马的8个可能跳跃方向。
  • zhang数组定义了与8个方向相对应的4个拐马角点,用于确定马的走法。
  • XY变量存储棋盘的行数和列数。
  • a数组存储起点和终点的坐标。
  • Q队列用于BFS过程中的层级遍历。
  • visit二维数组标记已访问的点,避免重复搜索。
  • can二维数组标记障碍点,马不能跳到这些点上。
  • cnt变量记录从起点到当前点的步数。

3. 检查函数check

  • 检查函数check确定给定点是否在棋盘的边界内。

4. BFS算法实现BFS

  • BFS函数是核心算法实现:
    • 初始化队列Q,将起点坐标和步数压入队列。
    • 使用while循环,只要队列不为空,就继续搜索。
    • 在循环中,弹出队列前端的点作为当前点,并检查是否到达终点。
    • 如果到达终点,输出步数cnt并结束搜索。
    • 对于当前点的每个可能跳跃方向,检查是否在棋盘内、是否为重复点、是否为障碍点。
    • 如果跳跃后的点有效,将其压入队列,并标记为已访问。

5. 主函数main

  • 读取测试用例数量n,并对每个测试用例执行以下操作:
    • 清空队列Q和两个二维数组visitcan
    • 读取棋盘大小XY
    • 读取起点和终点坐标。
    • 读取障碍点数量m,并使用循环读取每个障碍点的坐标,将其标记在can数组中。
    • 调用BFS函数执行搜索,并输出结果。

6. 程序结束

  • 当所有测试用例处理完毕后,程序正常结束并返回0。

代码逻辑分析

  • 代码使用BFS算法来找到从起点到终点的最短路径,同时考虑了障碍物和马的走法规则。
  • BFS是一种适合解决最短路径问题的算法,因为它能够一层一层地遍历所有可能的路径。

潜在问题

  • 如果棋盘很大或障碍点很多,visitcan数组可能会消耗大量内存。
  • 代码没有处理棋盘上没有有效路径到达终点的情况。

改进建议

  • 对于大规模棋盘,考虑使用更节省内存的数据结构,如位图或哈希表。
  • BFS函数中添加对搜索失败的检查,如果队列为空且未找到终点,输出适当的消息。
  • 考虑使用std::vector代替固定大小的数组,以提高代码的灵活性和安全性。
  • 对输入数据进行有效性检查,确保它们在预期的范围内,并且是有效的棋盘坐标。
  • 代码中没有提供障碍点的输入示例,实际使用时需要确保输入格式正确。

部分代码

代码如下(检查点是否在棋盘内 ):

int check(int a, int b)  
{if (a > 0 && a <= X && b > 0 && b <= Y)return 1;elsereturn 0;
}

代码如下( 广度优先搜索算法):

void BFS()
{int H, L;cnt = 0;Q.push(a[0]);Q.push(a[1]);Q.push(cnt);visit[a[0]][a[1]] = 1;while (!Q.empty()){H = Q.front(); Q.pop();L = Q.front(); Q.pop();cnt = Q.front(); Q.pop();if (H == a[2] && L == a[3]){cout << cnt << endl;return;}for (int i = 0; i < 8; i++){if (can[H + zhang[i / 2][0]][L + zhang[i / 2][1]] == 0)  //判断该点是否为拐马角点if (check(H + D[i].x, L + D[i].y) && !visit[H + D[i].x][L + D[i].y]&&!can[H + D[i].x][L + D[i].y])  /*判断跳的那个点是否在棋盘内,跳的点不能是重复点,跳的点不能是障碍点*/{Q.push(H + D[i].x);Q.push(L + D[i].y);Q.push(cnt + 1);visit[H + D[i].x][L + D[i].y] = 1;}}}cout<<"can not reach!"<<endl;
}

AC代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct dir
{int x;int y;
};
dir D[8] = { {-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2} };  //马跳的8个方向
int zhang[4][2] = { -1,0,0,1,1,0,0,-1 };  //8个方向对应的4个拐马角点。
int X,Y;  //棋盘大小
int a[6];
queue<int> Q;
int visit[101][101];  //判断是否为重复点
int can[101][101];  //判断是否为障碍点
int cnt;
int check(int a, int b)  //检查点是否在棋盘内
{if (a > 0 && a <= X && b > 0 && b <= Y)return 1;elsereturn 0;
}
void BFS()
{int H, L;cnt = 0;Q.push(a[0]);Q.push(a[1]);Q.push(cnt);visit[a[0]][a[1]] = 1;while (!Q.empty()){H = Q.front(); Q.pop();L = Q.front(); Q.pop();cnt = Q.front(); Q.pop();if (H == a[2] && L == a[3]){cout << cnt << endl;return;}for (int i = 0; i < 8; i++){if (can[H + zhang[i / 2][0]][L + zhang[i / 2][1]] == 0)  //判断该点是否为拐马角点if (check(H + D[i].x, L + D[i].y) && !visit[H + D[i].x][L + D[i].y]&&!can[H + D[i].x][L + D[i].y])  /*判断跳的那个点是否在棋盘内,跳的点不能是重复点,跳的点不能是障碍点*/{Q.push(H + D[i].x);Q.push(L + D[i].y);Q.push(cnt + 1);visit[H + D[i].x][L + D[i].y] = 1;}}}cout<<"can not reach!"<<endl;
}
int main()
{int n;cin >> n;while (n--){cin >> X >> Y;while (!Q.empty())Q.pop();memset(visit, 0, sizeof(visit));memset(can, 0, sizeof(can));cin >> a[0] >> a[1] >> a[2] >> a[3];int m;cin >> m;while (m--){int a, b;cin >> a >> b;can[a][b] = 1;}BFS();}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/869577.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《警世贤文》摘抄:勤奋篇、取财篇、疏财篇、是非篇、安心篇、防忧篇(多读书、多看报、少吃零食多睡觉)

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140319751 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

简易限流实现

需求描述 写一个1秒两个的限流工具类&#xff0c;2r/s 使用semaphore 代码实现-类似令牌桶算法 public class LimitHelper {private int maxLimit;private Semaphore semaphore;private int timeoutSeconds;public LimitHelper(int maxLimit, int timeoutSeconds) {this.max…

LNMP搭建Discuz和Wordpress

1、LNMP L:linux操作系统 N&#xff1a;nginx展示前端页面web服务 M&#xff1a;mysql数据库&#xff0c;保存用户和密码&#xff0c;以及论坛相关的内容 P&#xff1a;php动态请求转发的中间件 数据库的作用&#xff1a; 登录时验证用户名和密码 创建用户和密码 发布和…

昇思25天学习打卡营第十七天|文本解码原理--以MindNLP为例

背景 提供免费算力支持&#xff0c;有交流群有值班教师答疑的华为昇思训练营进入第十七天了。 今天是第十七天&#xff0c;从第十天开始&#xff0c;进入了应用实战阶段&#xff0c;前九天都是基础入门阶段&#xff0c;具体的学习内容可以看链接 基础学习部分 昇思25天学习打卡…

Unity发布webgl之后修改StreamingAssets 内的配置文件读取到的还是之前的配置文件的解决方案

问题描述 unity发布webgl之后&#xff0c;修改在StreamingAssets 中的配置信息&#xff0c;修改之后读取的还是之前的配置信息 读取配置文件的代码IEnumerator IE_WebGL_LoadWebSocketServerCopnfig(){var uri new System.Uri(Path.Combine(Application.streamingAssetsPath…

居家客服人员分散,更需要统一客服话术

1、居家客服服务需求激增 近年来&#xff0c;随着线上消费的兴起&#xff0c;以及客服人员成本的不断攀升&#xff0c;越来越多的企业选择雇佣居家客服&#xff0c;以客服服务发包的形式接待客户的咨询。因此&#xff0c;居家客服人员的数量也逐渐增加。然而&#xff0c;居家办…

c++ 多边形 xyz 数据 获取 中心点方法

有需求需要对。多边形 获取中心点方法&#xff0c;绝大多数都是 puthon和java版本。立体几何学中的知识。 封装函数 point ##########::getCenterOfGravity(std::vector<point> polygon) {if (polygon.size() < 2)return point();auto Area [](point p0, point p1, p…

nftables(4)表达式(2)主要表达式(PRIMARY EXPRESSIONS)

简介 上篇文章已经介绍了数据类型&#xff0c;如INTERGER TYPE、BITMASK TYPE、STRING TYPE、LINK LAYER ADDRESS TYPE、 IPV4 ADDRESS TYPE、 IPV6 ADDRESS TYPE、BOOLEAN TYPE、ICMP TYPE、CONNTRACK TYPES等。那么本篇文章主要介绍PRIMARY表达式的相关内容。 PRIMARY EXPR…

PHP充电桩小程序系统源码

绿色出行新伴侣&#xff01;充电桩小程序&#xff0c;让充电不再烦恼✨ &#x1f50b; 开篇&#xff1a;告别电量焦虑&#xff0c;充电桩小程序来救场&#xff01; 在这个电动车日益普及的时代&#xff0c;电量不足成了不少车主的“心头大患”。但别担心&#xff0c;充电桩小…

记一次mysql导出到达梦数据库

DM8管理工具 DM管理工具&#xff08;官方&#xff09;DBeaver - jdbc驱动 MySql迁移到DM8 使用官方DM数据迁移工具 新建迁移工程选择MySQL>DM填写mysql连接信息、添加dm连接信息执行 DM8数据脚本制作过程 使用DM管理工具 导出全部&#xff1a;进入对应模式>表>选…

nprogress进度条插件

打开一个页面时&#xff0c;往往会伴随一些请求&#xff0c;并且会在页面上方出现进度条。它的原理时&#xff0c;在我们发起请求的时候开启进度条&#xff0c;在请求成功后关闭进度条&#xff0c;所以只需要在request.js中进行配置。 如下图所示&#xff0c;我们页面加载时发起…

grblHAL的代码学习笔记和解读

源代码在 https://github.com/grblHal 目前日期2024/07/09 或许几年以后代码会做变更. 仅供参考. grbl是个很好的库. grblHAL是在grbl的基础上改进来的. grbl的板子通过串口或者SD卡或网络与上位机进行通信, 上位机负责查看和人机交互. 上位机把CAM软件生成的代码读入以后,转换…

docker pull rabbimq镜像失败

在使用docker pull rabbitmq的镜像的时候&#xff0c;找了好多源&#xff0c;都报错如下&#xff1a; Error response from daemon: toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.dock…

3.上传图片(阿里云空间,oss验证)

笔记 20240710 未验证&#xff0c;现在还没有阿里云空间&#xff0c;等买个sit环境就可以验证一下。 前端 页面 <!--页面--> <el-form-item label"优惠券图片" prop"couponImg"><single-upload v-model"dataForm.couponImg"&g…

【R语言+Gephi】利用R语言和Gephi实现共发生网络的可视化

【R语言Gephi】利用R语言和Gephi实现共发生网络的可视化 注&#xff1a;本文仅作为自己的学习记录以备以后复习查阅 一 概述 Gephi是一款开源免费的多平台网络分析软件&#xff0c;在Windows、Linux和Mac os上均可以运行&#xff0c;像他们官网所说的&#xff0c;他们致力于…

【深度学习】Pytorch完成线性回归!

&#x1f34a;嗨&#xff0c;大家好&#xff0c;我是小森( &#xfe61;ˆoˆ&#xfe61; )&#xff01; 易编橙终身成长社群创始团队嘉宾&#xff0c;橙似锦计划领衔成员、阿里云专家博主、腾讯云内容共创官、CSDN人工智能领域优质创作者 。 易编橙&#xff1a;一个帮助编程小…

提升困难生学工支持:智慧校园的新功能介绍

智慧校园的学工管理系统内嵌的困难生信息管理功能&#xff0c;是一个综合性的服务平台&#xff0c;专注于精准识别校园内的经济困难学生&#xff0c;并给予他们必要的帮助与关怀&#xff0c;确保每位学生都能在公平的环境中追求学业和个人成长。这一功能通过一系列信息化手段&a…

标准立项 | 深度脱氨生物填料选型指南

编制单位&#xff1a;北京科净源科技股份有限公司、中国地质大学(北京)、中华环保联合会水环境治理专业委员会、清华大学、北京师范大学、中国环境科学研究院、清华大学、天津高端装备研究院、中车环境科技有限公司、云南滇池水务股份有限公司等。

职升网:考取专科学历的途径包括以下这些!

高考统招&#xff1a; 每年6月举行的全国统一高考&#xff0c;是获得专科学历的传统途径。 考生需参加由教育部组织的统一考试&#xff0c;按照分数由高到低依次录取。 适合高中毕业生或具有同等学历的学生。 自学考试&#xff1a; 又称自考&#xff0c;是一种没有入学考试…

C/C++ list模拟

模拟准备 避免和库冲突&#xff0c;自己定义一个命名空间 namespace yx {template<class T>struct ListNode{ListNode<T>* _next;ListNode<T>* _prev;T _data;};template<class T>class list{typedef ListNode<T> Node;public:private:Node* _…