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)跳.规定只能往右跳,不准 ...
随机推荐
- 动环监控系统中B接口的实现
动环监控系统简述 1.术语介绍 1.1 省集中监控中心-Province Supervision Center(PSC) 面向多FSU管理的高级监控层次,即省集中监控中心,通过开放的数据协议,连接监控 ...
- C# List集合类常用操作:三、查找
List集合查询数据 List<Employees> employees = new List<Employees>(); employees.Add(new Employee ...
- 显示锁lock
一.内置锁sync 和 显示锁lock概念 1.synv锁又叫内置锁,不能中断,拿不到无限等待即阻塞: java自带关键字: 隐式可重入: 重入锁:锁对应对象要多次调用对应方法,如递归 2. lock ...
- 企业快速开发平台Spring Cloud+Spring Boot+Mybatis+ElementUI 实现前后端分离
鸿鹄云架构一系统管理平台 鸿鹄云架构[系统管理平台]使用J2EE技术来实施,是一个大型分布式的面向服务的JavaEE体系快速研发平台,基于模块化.服务化.原子化.热部署的设计思想,使用成熟领先的无商业 ...
- 【第四篇】-Git 工作区、暂存区和版本库之Spring Cloud直播商城 b2b2c电子商务技术总结
Git 工作区.暂存区和版本库 基本概念 我们先来理解下 Git 工作区.暂存区和版本库概念: 工作区:就是你在电脑里能看到的目录. 暂存区:英文叫 stage 或 index.一般存放在 .git ...
- UVA 11853 Paintball(几何数学+DFS)
https://vjudge.net/problem/UVA-11853 根据题意描述,相当于在一个正方形中有若干个圆形障碍物,问是否能从左边界走到右边界.判断是否有解需要一点创造性的思维:不妨把正方 ...
- Go学习【01】:初步学习需要的知识
理解以下知识,初步写简单go项目就足够了 语言参考(基础篇) 基本语法 基本组成 包声明 引入包 函数 变量 语句 & 表达式 注释 其它(可忽略) go没有像php.js那样需要在文件开始申 ...
- Jmeter扩展组件开发(8) - 函数助手扩展开发demo
前提条件 1.pom文件引用ApacheJMeter_functions包 <dependency> <groupId>org.apache.jmeter</groupI ...
- Java学习之随堂笔记系列——day02
昨天内容回顾1.安装jdk和配置环境变量 配置JAVA_HOME和path,只要配置成功之后就可以直接使用java和javac命令.2.HelloWorld案例3.java的基础语法 注释:给程序的解 ...
- 『GoLang』字典Map
map是一种元素对的无序集合,一组称为元素value,另一组为唯一键索引key. 未初始化map的值为nil.map 是引用类型,可以使用如下声明: var map1 map[keytype]valu ...