马走棋盘之最短路径步数——C

2023-05-16

描述问题

输入测试例子数T,每个例子输入棋盘大小m行n列, (1<=m,n<=500),再输入a,b,c,d表示(a,b)–>(c,d),(1<=a,c<=m)且(1<=b,d<=n)且两点不是同一点,若马走的到,输出按照马的走法(日字走法)的 最短路径的步数,否则输出0。

分析问题

最短路径,让人联想到bfs,于是我们可以用队列,若未访问过,将可走的点放入队列中,直到队列为空之前,若走到则输出最短路径所走的步数,若队列已经空而仍然未到达目标,则输出0;

代码 + 注释

#include <stdio.h>
#include <stdlib.h> 
//注意,为方便数组访问,纵向为x轴,横向为y轴
typedef struct {
	int x;//x坐标
	int y;//y坐标
	int len;//步数
}node;

typedef node* Node;

int main() {
	
	int test_num;//测试例子数
	scanf("%d",&test_num);
	
	while(test_num --) {
		
		int m , n;
		scanf("%d %d",&m,&n);//m行n列的棋盘
		//使用calloc动态分配时已初始化为0,方便
		int **mark = (int **)calloc((m+1),sizeof(int *));
		for(int i = 0;i < m + 1;i ++) {
			mark[i] = (int *)calloc((n+1),sizeof(int));
		}//创建标记数组,记录哪些点已经访问过,1代表已访问,0代表未访问
		
		int a,b,c,d;
		scanf("%d %d %d %d",&a,&b,&c,&d);//输入坐标
		mark[a][b] = 1;//将起点标记为访问过
		
		int move_x[] = {-2,-1,1,2,2,1,-1,-2};
		int move_y[] = {1,2,2,1,-1,-2,-2,-1};
		//以上两个数组是对应每个点按照马字走法对应的x,y坐标的变化
		//比方说index(数组索引)为0时,代表(x-2,y+1)。
		Node queue = (Node)calloc(m*n+1,sizeof(node));//创建队列
		
		int head = 0,tail = 1;//head指向队列头,tail指向队列尾
		//这里不打算用queue[0],纯属个人习惯
		queue[1].x = a;
		queue[1].y = b;
		queue[1].len = 0;//让起点坐标入队列,由于马未开始动,步数为0
		
		int tag = 0;//标记是否走得到的变量
		
		while(head <= tail) {//队列非空时 

			head ++;//取出头结点使用,然后头结点出队
			
			for(int i = 0;i < 8;i ++) { //此处是为了遍历8个方向,即bfs

				//(queue[head].x + move_x[i] > 0)
				//横坐标不越界
				//(queue[head].y + move_y[i] > 0)
				//纵坐标不越界
				//(mark[queue[head].x + move_x[i]][queue[head].y + move_y[i]] == 0)
				//下一个方向所到达的点未访问过
				if(queue[head].x + move_x[i] > 0 
				&& queue[head].y + move_y[i] > 0 
				&& mark[queue[head].x + move_x[i]][queue[head].y + move_y[i]] == 0) {
				//满足上述三个条件马才可走到下一个方向所到的点
	
					tail ++;
					
					queue[tail].x = queue[head].x + move_x[i];
					
					queue[tail].y = queue[head].y + move_y[i];
					//可到达的点入队
					
					mark[queue[tail].x][queue[tail].y] = 1;
					//再标记当前到达的点为已访问
					
					queue[tail].len = queue[head].len + 1;
					//这一步是用于计算步数,注意每次8个方向搜索完之后,入队的结点的len值都是一样的,然后下一层搜索再让步数+1
					
					if(queue[tail].x == c && queue[tail].y == d) {//如果已经到达目标点
						printf("%d\n",queue[tail].len);
						//输出最短路径的步数
						tag = 1;
						//标记已经能够到达目标点
						break;
						//退出内层循环
					}
					
				}
			} 
			if(tag) break;//若找到点,退出外层循环
		}
		if(tag == 0) printf("0\n");
		//若队列已空,tag == 0代表不能到达,按照题意输出0;
		
		for(int i = 0;i < m + 1;i ++) {
			free(mark[i]);
		}
		free(mark);//释放
		free(queue);//释放
	}
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

马走棋盘之最短路径步数——C 的相关文章

  • Android Studio 打包时 Signature Version 选择 V1 V2 说明

    问题描述 v1和v2 Android 7 0中引入了APK Signature Scheme v2 xff0c v1是jar Signature来自JDK V1 xff1a 应该是通过ZIP条目进行验证 xff0c 这样APK 签署后可进行
  • Android 多Dex分包机制

    问题引入 随着项目工程越来越庞大 xff0c 代码的方法数不断增长到一定程度 xff0c 就出现Android 低版本系统应用无法安装的情况 那么这是哪里出错了 xff1f Android系统对安装包有哪些限制 xff1f 前一阵子 xff
  • 安装openstack时碰到的错误

    文章目录 目录安装keystone identity时遇到的错误信息glance验证操作错误信息计算节点安装openstack nova compute找不到包openstack nova compute安装后服务起不来openstack
  • Linux什么时候能代替Windows?现在有什么困难?2022新一年Linux目标

    我举出一个身边例子 xff1a 昨天 xff0c 我的一个亲戚的电脑坏了 xff0c 是一个七八年前配置笔记本电脑 xff0c 找我修 xff0c 我本来想安装Windows10 xff0c 但是想到现在我电脑的主系统都是Linux了 xf
  • apt-get update error解决方法

    apt get update error Unable to lock the administration directory var lib dpkg is another proc root 64 ony an opt devstac
  • PVE安装win10并开启远程桌面

    接上一篇 一 win10安装镜像最新版下载 下载地址 xff1a https next itellyou cn 现在的win10最新版时22h2 文件名为zh cn windows 10 business editions version
  • Win10相机打开后显示灰色的原因(仅适用于联想笔记本)

    症状描述 xff1a 打开相机 xff0c 显示灰色 xff0c 中间有一个相机带斜杠的图标 我先说解决方法 xff0c 再吐槽 xff1a 如果网上的方法都不行 xff0c 就检查自己的笔记本是否安装了联想电脑管家 xff0c 如果有 x
  • Visual Studio 2015 tools for Unity 安装使用

    P1 xff1a 安装 微软好像把这个工具整合在Visual studio 2015一起了 xff0c 没找到单独的链接 CSDN链接 xff1a http download csdn net detail devilsomezeng 95
  • VMware部署Debian系统

    前面在手机和平板上安装了UserLAnd软件 xff0c 初步实现了随身携带Linux系统的小目标 但是前面也提到了目前存在一个小问题 xff0c 那就是没有办法远程登录 xff0c 简单调整了一下还没解决 xff0c 看来还是要简单学习一
  • Openstack关于Regions和Availability Zones

    声明 xff1a 本博客欢迎转发 xff0c 但请保留原作者信息 内容系本人学习 研究和总结 xff0c 如有雷同 xff0c 实属荣幸 xff01 原文地址 xff1a http blog csdn net gtt116 在AWS中有Re
  • Manjaro 安装搜狗输入法

    经历了长时间搜索和实践 xff0c 我终于安装好了搜狗输入法 xff0c 基本套路就还是按照大多数博客介绍的命令行装的 xff1a sudo pacman S fcitx im sudo pacman S fcitx configtool
  • layui:弹窗跨域问题 Uncaught DOMException: Blocked a frame with origin

    在日常开发中经常出现A系统调用B系统的相关功能 xff0c 在B系统中进行layer弹窗时 xff0c 提示错误信息 Uncaught DOMException xff0c 经过查询网上资料 xff0c 发现是跨域错误 仔细检查代码 xff
  • CentOS安装最新稳定版Jenkins

    文章目录 1 Java版本兼容列表2 JDK安装3 Jenkins安装3 1 定义Jenkins RPM仓库3 2 进行安装 4 Jenkins启动4 1 指定Java程序4 2 相关命令 5 FAQ5 1 目录介绍5 2 AWT is n
  • Codeforces Global Round 21参考代码

    Codeforces Global Round 21 A xff1a include lt iostream gt include lt algorithm gt include lt cstdio gt include lt cstrin
  • 有设计才艺的小伙伴千万不要错过GIMP

    GIMP是一个非常好的位图设计软件 xff01 支持LInux系统 xff0c Windows系统 xff0c Mac xff0c GIMP一直陪着我从Windows转到Linux xff0c 直到现在还在用 个人感觉比PhotoShop强
  • python下载

    python下载 1 打开python官网 网址 xff1a python org 1 1按照对应的操作系统选择 1 2下滑找到3 10 0 版本根据电脑配置选择64位或者32位 一般选择左列的稳定发行版 注意 xff0c 这里有embed
  • Android 捕获主线程异常崩溃

    一般情况下我们想要捕获全局异常会调用Thread setDefaultUncaughtExceptionHandler方法 xff1b 这个方法虽然能捕获所有线程的异常 xff0c 但如果是主线程发生未捕获异常 xff0c APP虽然不会崩
  • 使用cmake编译一段代码时出现VS2015 The C/CXX compiler identification is unknown

    打开CmakeError log 里面有如下错误 xff1a D Program Files Microsoft Visual Studio 14 0 VC bin x86 amd64 link exe ERRORREPORT QUEUE
  • Ubuntu安装VirtualBox6.1,报错依赖于libqt5opengl5...

    自己在安装Vbox6 1时遇到依赖问题 xff0c 多次尝试无法解决 xff0c 最后找到以下解决方法 由于网上看到的很多方法并不能解决问题 xff0c 这里将原文做转载 xff0c 希望能帮助到更多的人 1 方法一 xff1a 从Ubun

随机推荐

  • Debian 10(buster) 更换可用的国内软件源

    由于Debian 10 xff08 buster xff09 还比较新 xff0c 有很多源都使用不了 xff0c 有的还连接不上 xff0c 以下是亲自试过可以使用的源 xff0c 需要的小伙伴可以试试 163源 deb cdrom De
  • ubuntu 下搭建 Jenkins 并配置部署环境

    转载 xff1a https www cnblogs com shuoer p 9471839 html 前言 xff1a 因为要搭建Jenkins xff0c 试了很多办法都不行 xff0c 后来找到这篇博客装好了 xff0c 分享下 x
  • 批处理文件(.dat/.cmd)打开多个文件

    在window下 xff0c 有时候经常需要一次性打开多个文件 xff0c 如果都在一个目录下还好 xff0c 但是如果需要打开的文件分布在各个地方 xff0c 逐一打开还是挺麻烦的 通过批处理可以偷下懒 废话少说 xff0c 例文如下 x
  • STC 定时器/计数器2 操作详解 (基于STC89C52RC参考文档)

    一 认识STC定时器2 T2 STC 定时器2 xff08 即T2 xff09 是一个16位定时 计数器 通过设置特殊功能寄存器T2CON中的C T2位 xff0c 可将其作为定时器或计数器 xff08 特殊功能寄存器T2CON的描述如表1
  • 第五周作业 C题

    C题 平衡字符串 题目描述 xff1a 一个长度为 n 的字符串 s xff0c 其中仅包含 Q W E R 四种字符 如果四种字符在字符串中出现次数均为 n 4 xff0c 则其为一个平衡字符串 现可以将 s 中连续的一段子串替换成相同长
  • 第八周作业 B题

    B 猫猫向前冲 题目描述 xff1a 众所周知 xff0c TT 是一位重度爱猫人士 xff0c 他有一只神奇的魔法猫 有一天 xff0c TT 在 B 站上观看猫猫的比赛 一共有 N 只猫猫 xff0c 编号依次为1 xff0c 2 xf
  • Linux安装Git和GitLab,最新教程,细到极致

    大家早上好呀 xff0c 又到了周末了 xff0c 心情很舒服 摸鱼了一上午 xff0c 想要写点东西 今天给大家带来的是 xff0c git和GitLab的安装 快速定位到Gitlab安装 话不多说 xff0c 开始吧 1 创建git文件
  • Ubuntu安装搜狗输入法无论如何就是找不到的解决方法///Ubuntu怎么安装搜狗输入法///Ubuntu怎么输入中文///Ubuntu搜狗输入法怎么修改皮肤

    我刚装上ibus的时候 xff0c 感觉一点也不好用 xff0c 于是就换成了fcitx打算安装搜狗输入法for Linux xff0c 结果各种方法都试过了 xff0c 无论如何都找不到搜狗输入法 xff0c 我偶然把fcitx5换成了f
  • iOS-UI之简易图表——饼图(扇形图)、柱状图、折(曲)线图

    话不多说 xff0c 先来看看效果 xff1a 1 饼图 扇形图 2 柱状图 3 折线图 样子粗糙 xff0c 见笑了 现在来看看实现过程 一 饼图 扇形图 1 实现思路 实现思路其实很简单 xff0c 首先算传入数据数组的数据总和 xff
  • debian小巧好看的桌面

    先看完 xff0c 不然 xff0c 你一定会后悔的 不好看 xff0c 你打我 sudo apt get install xfce4 sudo apt get install xfce4 goodies sudo apt get inst
  • ubuntu下安装arm-linux-gcc交叉编译链

    你好 xff01 这里是风筝的博客 xff0c 欢迎和我一起交流 交叉编译链下载地址 xff1a ftp ftp gnu org gnu gcc 或者在arm官网下载 https developer arm com open source
  • 嵌入式Linux驱动笔记(二十一)------GPIO和Pinctrl子系统的分析和思考

    你好 xff01 这里是风筝的博客 xff0c 欢迎和我一起交流 好久都没有写东西了 xff0c 最近来广州某公司实习 xff0c 顺便记录下吧 吐槽下 xff0c 因为是二级保密单位 xff0c 公司里电脑不给联网 xff0c 贼难受 不
  • Feign和RestTemplate 的使用比较

    Feign和RestTemplate 的使用比较 一 RestTemplate 基于RestTemplate 进行远程服务调用 但是在调用之前基于loadBalancerClient对象去从nacos注册中心基于服务名查找服务实例 可能有多
  • ubuntu16.04 配置远程桌面

    sudo apt get y install xfce4 xrdp vnc4serverdpkg L xrdp 在显示的结果中有如下一行即可 xff1a etc xrdp xrdp ini配置xfce4桌面会话文件 软件安装完毕后 xff0
  • C++中构造函数的超详细讲解

    C 43 43 在C语言的基础上增加了类和对象的概念 xff0c 官方对类和对象的解释是 xff1a 对象是类的实例化 xff0c 类是对象的抽象 xff0c 其实这个概念也很抽象 xff0c 举一个简单的例子来说明这个关系 xff1a 在
  • 计算机网络实验三 路由协议的配置

    一 实验目的 1 掌握静态路由协议的配置 2 掌握RIP协议特点和其配置方式 xff1b 3 掌握OSPF协议的特点和其配置方式 xff1b 二 实验要求 1 掌握静态路由协议的配置 1 配置一个互联网络 xff0c 可如下图所示 xff1
  • C语言实现有限状态机

    以下是转载内容 xff1a 传说中的分隔符 来源 1 xff1a http www cnblogs com swingboat archive 2005 07 27 201488 html 转载 1 有限状态机的实现 lt script t
  • linux内核-中断的响应和服务

    搞清了i386 CPU的中断机制和内核中有关的初始化以后 xff0c 我们就可以从中断请求的发生到CPU的响应 xff0c 再到中断服务程序的调用与返回 xff0c 沿着CPU所经历的路线走一遍 这样 xff0c 既可以弄清和理解linux
  • Ubuntu的Java编辑器eclipse打不开闪退的解决方法

    Linux Ubuntu的eclipse安装上了 xff0c 但是打不开 xff0c 闪退的解决方法 xff1a 首先确保你已经在安装了eclipse 如果你已经安装了eclipse xff0c 你就可以向下进行 xff1a 你点击ecli
  • 马走棋盘之最短路径步数——C

    描述问题 输入测试例子数T xff0c 每个例子输入棋盘大小m行n列 1 lt 61 m n lt 61 500 再输入a b c d表示 a b gt c d xff0c 1 lt 61 a c lt 61 m 且 1 lt 61 b d