00 题目

描述:

在国际象棋中,马的走法与中车象棋类似,即俗话说的“马走日”,下图所示即国际象棋中马(K)在一步能到达的格子(其中黑色的格子是能到达的位置)。 现有一200*200大小的国际象棋棋盘,棋盘中仅有一个马,给定马的当前位置(S)和目标位置(T),求出马最少需要多少跳才能从当前位置到达目标位置。

输入:

本题包含多个测例。输入数据的第一行有一个整数N(1<=N<=1000),表示测例的个数,接下来的每一行有四个以空格分隔的整数,分别表示马当前位置及目标位置的横、纵坐标C(x,y)和G(x,y)。坐标由1开始。

输出:

对于每个测例,在单独的一行内输出一个整数,即马从当前位置跳到目标位置最少的跳数。

输入样例:

2
1 1 2 1
1 5 5 1

输出样例:

3
4

01 思路

01-1 类型

很明显求解“马从当前位置跳到目标位置最少的跳数”,且在一个类迷宫的Map里,考虑使用广度优先搜索,每次将可以跳到的的且没到过的位置入队,判断是否达到终点。

01-2 算法

由于对于多组起点终点进行广搜,所以在上位函数应当是个循环,循环控制变量应该是组数,下面是对于每一组进行广搜的步骤:

  • 初始化地图

  • 进行队列操作的准备

    • 将输入起点转换为队列类型Node

    • 创建队列并作初始化操作map值为0,将起点入队

  • 队列非空,执行下列操作

    • 取出队列首节点,进行判断

      • 若为终点,return当前map数组里的值即为路径长度

      • 若非终点,则遍历jump数组的跳法(此题中一共8个)产生子节点NextNode,将符合条件的入队

    • 循环这个操作,直到队列空

02 代码

 1 //跳马
2 #include<iostream>
3 #include<queue>
4 ​
5 using namespace std;
6 ​
7 typedef struct{
8 int row;
9 int col;
10 }Node;
11 ​
12 int n;
13 int inx,iny;
14 //出发点
15 int outx,outy;
16 //终点
17 int map[200][200];
18 //棋盘二维数组
19 int jump[8][2] = {{1,2},{2,1},{1,-2},{2,-1},{-1,-2},{-2,-1},{-1,2},{-2,1}};
20 //跳跃步法,遍历这个数组就可以遍历某个点的所有下一位置节点
21 int result[1000];
22 //result是用来记录每一组入口出口的最短路径长度,题目要求1000
23 ​
24 void init();
25 int bfs();
26 void oper_map();
27 void out_result();
28 ​
29 int main(){
30 //广搜组数
31 cin >> n;
32 //init()初始化map,但是这一步需要在每一次广搜前初始化,来实现归零
33 //init();
34 //oper_map//调用bfs填充result
35 oper_map();
36 //cout_result//输出结果
37 out_result();
38 return 0;
39 }
40 void init(){
41 for(int i = 0; i < 200; i++){
42 for(int j = 0; j < 200; j++){
43 map[i][j]=-1;
44 }//初始化这个map
45 }
46 }
47 void oper_map(){
48 for(int i = 0;i < n; i++){
49 cin >> inx >> iny >> outx >> outy ;
50 result[i] = bfs();
51 }
52 }
53 void out_result(){
54 for(int i = 0; i < n; i++){
55 cout << result[i] << endl;
56 }
57 }
58 int bfs(){
59 //每次都需要初始化map
60 init();
61 ​
62 Node node;
63 node.row = inx - 1;
64 node.col = iny - 1;
65 ​
66 queue<Node> q;
67 q.push(node);
68 map[node.row][node.col] = 0;
69 ​
70 while(!q.empty()){
71 Node nowNode = q.front();
72 q.pop();
73 int row = nowNode.row;
74 int col = nowNode.col;
75 if(row == outx - 1 && col == outy - 1){
76 return map[row][col];
77 }
78 else{
79 Node nextNode;
80 for(int i = 0;i < 8; i++){
81 nextNode.row = row + jump[i][0];
82 nextNode.col = col + jump[i][1];
83 ​
84 if(nextNode.row >= 0 && nextNode.row < 200 && nextNode.col >= 0 && nextNode.col < 200 && map[nextNode.row][nextNode.col] == -1){
85 map[nextNode.row][nextNode.col] = map[row][col] + 1;
86 q.push(nextNode);
87 }
88 }
89 }
90 }
91 return -1;
92 }

noj -> 跳马的更多相关文章

  1. [itint5]跳马问题加强版

    http://www.itint5.com/oj/#12 首先由跳马问题一,就是普通的日字型跳法,那么在无限棋盘上,任何点都是可达的.证法是先推出可以由(0,0)到(0,1),那么由对称型等可知任何点 ...

  2. [BZOJ 4417][Shoi2013]超级跳马

    4417: [Shoi2013]超级跳马 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 379  Solved: 230[Submit][Status ...

  3. Noj - 在线强化训练4

    状态 题号 竞赛题号 标题 × 1092 A 童年的回忆——计算24 × 1145 B 求图像的周长 × 1144 C 农场灌溉问题 × 1202 D 数独游戏 × 1243 E 循环赛日程表 × 1 ...

  4. 洛谷 P3990 [SHOI2013]超级跳马 解题报告

    P3990 [SHOI2013]超级跳马 题目描述 现有一个\(n\) 行 \(m\) 列的棋盘,一只马欲从棋盘的左上角跳到右下角.每一步它向右跳奇数列,且跳到本行或相邻行.跳越期间,马不能离开棋盘. ...

  5. 骑士周游问题跳马问题C#实现(附带WPF工程代码)

    骑士周游问题,也叫跳马问题. 问题描述: 将马随机放在国际象棋的8×8棋盘的某个方格中,马按走棋规则进行移动.要求每个方格只进入一次,走遍棋盘上全部64个方格. 代码要求: 1,可以任意选定马在棋盘上 ...

  6. cogs——49. 跳马问题

    49. 跳马问题 水题 dfs裸基础 #include<cstdio> using namespace std; ]={,,,,}, ans,my[]={,-,,-,}; inline v ...

  7. code vs 1216 跳马问题

    1216 跳马问题  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 题目 输入描述 Input Descri ...

  8. cogs 49. 跳马问题

    49. 跳马问题 ★   输入文件:horse.in   输出文件:horse.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 有一只中国象棋中的 “ 马 ” ,在半张 ...

  9. 洛谷 P1644 跳马问题

    P1644 跳马问题 题目背景 在爱与愁的故事第一弹第三章出来前先练练四道基本的回溯/搜索题吧…… 题目描述 中国象棋半张棋盘如图1所示.马自左下角(0,0)向右上角(m,n)跳.规定只能往右跳,不准 ...

随机推荐

  1. shp平滑处理

    在做图像数据处理时,经常会有栅格数据转矢量数据的操作,转换后的矢量文件会存在锯齿状边缘,不太美观,因此常常需要对矢量(shp)文件做平滑处理. 1 利用arcgis实现shp的平滑和简化 ArcToo ...

  2. Windows中nginx多次启动的问题

    在Windows上做开发环境中的nginx服务器.为了使nginx在后台运行,使用如下命令来启停nginx: cd <nginx安装目录> # 开启nginx并在后台运行 start ng ...

  3. 铺路、建路、指路:联想ISG给出一份全新的智能化“路书”

    新基建,新服务,新智能:联想给出的"高质量"方案 昨天,第七届联想创新科技大会(Lenovo Tech World 2021)正式召开.每年通过这个大会,各行各业不仅可以了解联想最 ...

  4. POJ1861 Network (Kruskal算法 +并查集)

    Network Description Andrew is working as system administrator and is planning to establish a new net ...

  5. P1118 [USACO06FEB]Backward Digit Sums G/S

    P1118 [USACO06FEB]Backward Digit Sums G/S 题解:  (1)暴力法.对1-N这N个数做从小到大的全排列,对每个全排列进行三角形的计算,判断是否等于N.  对每个 ...

  6. 开源的物联网技术平台(Thingsboard)

    1   总体说明 1.1   产品概述 1.1.1 Thingsboard作用 1.置备并控制设备. 2.采集设备数据并进行数据可视化. 3.分析设备数据,触发告警. 4.将数据传输到另一个系统. 5 ...

  7. 腾讯云 CIF 工程效能峰会,10 月 19 - 20 日震撼来袭!

    近年来,依托于云计算的飞速发展,腾讯云云产品更新迅猛,云原生生态构建初具规模,越来越多的企业也开始寻求与深入数字化转型之路.但在摸索与实践中,企业往往会进入"伪上云"的误区.除了单 ...

  8. windows系统升级python

    卸载python最干净的办法 https://blog.csdn.net/ic_zswdbk/article/details/88315779?utm_medium=distribute.pc_rel ...

  9. python之jsonpath

    json 官方文档:http://docs.python.org/library/json.html JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使 ...

  10. 鸿蒙内核源码分析(信号量篇) | 谁在负责解决任务的同步 | 百篇博客分析OpenHarmony源码 | v29.01

    百篇博客系列篇.本篇为: v29.xx 鸿蒙内核源码分析(信号量篇) | 谁在负责解决任务的同步 | 51.c.h .o 进程通讯相关篇为: v26.xx 鸿蒙内核源码分析(自旋锁篇) | 自旋锁当立 ...