noj -> 跳马
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 -> 跳马的更多相关文章
- [itint5]跳马问题加强版
http://www.itint5.com/oj/#12 首先由跳马问题一,就是普通的日字型跳法,那么在无限棋盘上,任何点都是可达的.证法是先推出可以由(0,0)到(0,1),那么由对称型等可知任何点 ...
- [BZOJ 4417][Shoi2013]超级跳马
4417: [Shoi2013]超级跳马 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 379 Solved: 230[Submit][Status ...
- Noj - 在线强化训练4
状态 题号 竞赛题号 标题 × 1092 A 童年的回忆——计算24 × 1145 B 求图像的周长 × 1144 C 农场灌溉问题 × 1202 D 数独游戏 × 1243 E 循环赛日程表 × 1 ...
- 洛谷 P3990 [SHOI2013]超级跳马 解题报告
P3990 [SHOI2013]超级跳马 题目描述 现有一个\(n\) 行 \(m\) 列的棋盘,一只马欲从棋盘的左上角跳到右下角.每一步它向右跳奇数列,且跳到本行或相邻行.跳越期间,马不能离开棋盘. ...
- 骑士周游问题跳马问题C#实现(附带WPF工程代码)
骑士周游问题,也叫跳马问题. 问题描述: 将马随机放在国际象棋的8×8棋盘的某个方格中,马按走棋规则进行移动.要求每个方格只进入一次,走遍棋盘上全部64个方格. 代码要求: 1,可以任意选定马在棋盘上 ...
- cogs——49. 跳马问题
49. 跳马问题 水题 dfs裸基础 #include<cstdio> using namespace std; ]={,,,,}, ans,my[]={,-,,-,}; inline v ...
- code vs 1216 跳马问题
1216 跳马问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 题目 输入描述 Input Descri ...
- cogs 49. 跳马问题
49. 跳马问题 ★ 输入文件:horse.in 输出文件:horse.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 有一只中国象棋中的 “ 马 ” ,在半张 ...
- 洛谷 P1644 跳马问题
P1644 跳马问题 题目背景 在爱与愁的故事第一弹第三章出来前先练练四道基本的回溯/搜索题吧…… 题目描述 中国象棋半张棋盘如图1所示.马自左下角(0,0)向右上角(m,n)跳.规定只能往右跳,不准 ...
随机推荐
- canal数据同步
前面提到数据库缓存不一致的几种解决方案,但是在不同的场景下各有利弊,而今天我们使用的canal进行缓存与数据同步的方案是最好的,但是也有一个缺点,就是相对前面几种解决方案会引入阿里巴巴的canal组件 ...
- Selenium系列(十八) - Web UI 自动化基础实战(5)
如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...
- VUE003. 解决data中使用vue-i18n不更新视图问题(computed属性)
案例 在国际化开发中,有一部分需要国际化的文字是由数据驱动的储存在data中,然而VUE的data存在很多无法实时更新视图的问题,比如v-for循环的标签,当数据层次过深,通过源数据数组的索引改变它的 ...
- C语言学习笔记---3.字符串格式化输入输出
1.C语言字符串 字符串(character string)是一个或多个字符的序列,例如:"Zing went the strings of my heart!" C语言没有专门用 ...
- Maven专题2——聚合与继承
聚合 聚合模块的<packaging>元素为pom 聚合模块通过<modules>元素标识自己的子模块,每个子模块对应了一个module元素 module元素中指定的是子模块所 ...
- 1.24学习总结——HTML常见标签
HTML 标签简写及全称 下表列出了 HTML 标签简写及全称: 标签 英文全称 中文说明 a Anchor 锚 abbr Abbreviation 缩写词 acronym Acronym 取首字母的 ...
- vijos题解
Vijos题解 题库地址:https://vijos.org/p P1001 谁拿了最多奖学金 题意:按照指定要求计算奖学金,直接用if判断即可 #include<iostream> us ...
- 【OI】计算分子量 Molar mass UVa 1586 题解
题目:(由于UVa注册不了,还是用vjudge) https://vjudge.net/problem/UVA-1586 详细说明放在了注释里面.原创. 破题点在于对于一个元素的组合(元素+个数),只 ...
- 【OI】Tex Quotes——UVa 272
题目: TEX is a typesetting language developed by Donald Knuth. It takes source text together with a fe ...
- PHP的变量赋值
这个标题估计很多人会不屑一顾,变量赋值?excuse me?我们学开发的第一课就会了好不好.但是,就是这样基础的东西,反而会让很多人蒙圈,比如,值和引用的关系.今天,我们就来具体讲讲. 首先,定义变量 ...