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. mybaits源码分析--binding模块(五)

    一.binding模块 接下来我们看看在org.apache.ibatis.binding包下提供的Binding模块 ,binding其实在执行sqlSession.getMapper(UserMa ...

  2. 从环境搭建到打包使用TypeScript

    目录 1.TypeScript是什么 2.TypeScript增加了什么 3.TypeScript环境的搭建 4.TypeScript的基本类型 5.TypeScrip编译选项 6.TypeScrip ...

  3. MySQL——优化

    MySQL数据库优化: 1.优化角度 安全: 数据可持续性 性能: 数据的高性能访问 2.优化范围(优化顺序---->) (1)存储.主机和操作系统: 主机架构稳定性 I/O规划及配置 swap ...

  4. JS014. toFixed( )调试踩坑 - 浏览器思维 点常量 & 点运算符

    Number.prototype.toFixed( ) 在观察toFixed()丢失精度问题,和对toFixed()方法重写的调试过程时,发现toFixed()对Number的识别有它自己的规则,并找 ...

  5. 查询同一张表符合条件的某些数据的id拼接成一个字段返回

    同一张表存在类似多级菜单的上下级关系的数据,查询出符合条件的某些数据的id拼接成一个字段返回: SELECT CONCAT(a.pid, ',', b.subid) AS studentIDS FRO ...

  6. 跨 Docker 宿主机 macvlan 类型

    跨 Docker 宿主机 macvlan 类型 前言 a. 本文主要为 Docker的视频教程 笔记. b. 环境为 三台 CentOS 7.0 虚拟机 (Vmware Workstation 15 ...

  7. CSP-J 2021 游记

    今年是本人第一次参加CSP组的竞赛. Day 0 晚上复习了几套初赛试卷,做到晚上十点多结束.其实暑假已经做过不少了. Day 1 早上继续复习noip历年真题,在洛谷有题上面自己做题,一向只能考十几 ...

  8. Java on Visual Studio Code的更新 – 2021年8月

    Nick Senior Program Manager, Developer Division at Microsoft 大家好,欢迎来到 8 月版的 Visual Studio Code Java ...

  9. git合并内容的1个方式

    诉求 把自己的改动的文件合并到目标分支: 不想改那些不属于自己开发时出现的冲突: 操作 开发分支dev,要合并至master分支 1 所有改动都已提交,保持分支的干净状态(working tree c ...

  10. echsop设置伪静态

    1.后台商店设置-基本设置-URL重写开启 2.修改httpd.conf文件 AllowOverride None 改为 AllowOverride AllLoadModule rewrite_mod ...