1330:【例8.3】最少步数

时间限制: 1000 ms         内存限制: 65536 KB
提交数: 10314     通过数: 5549

【题目描述】

在各种棋中,棋子的走法总是一定的,如中国象棋中马走“日”。有一位小学生就想如果马能有两种走法将增加其趣味性,因此,他规定马既能按“日”走,也能如象一样走“田”字。他的同桌平时喜欢下围棋,知道这件事后觉得很有趣,就想试一试,在一个(100×100)的围棋盘上任选两点A、B,A点放上黑子,B点放上白子,代表两匹马。棋子可以按“日”字走,也可以按“田”字走,俩人一个走黑马,一个走白马。谁用最少的步数走到左上角坐标为(1,1)的点时,谁获胜。现在他请你帮忙,给你A、B两点的坐标,想知道两个位置到(1,1)点可能的最少步数。

【输入】

A、B两点的坐标。

【输出】

最少步数。

【输入样例】

12 16
18 10

【输出样例】

8
9

【分析】

马有 12 种不同的扩展方向∶

(1)马走"日"∶(x-2,y-1)、(x-1,y-2)、(x-2,y+1)、(x-1,y+2)、(x+2,y-1)、(x+1,y-2)、(x+2, y+1)、(x+1,y+2)

(2)马走"田":(x-2,y-2)、(x-2.y+2)、(x+2,y-2)、(x+2,y+2)。

表示为:

int dx[12]={-2,-2,-1,1,2,2,2,2,1,-1,-2,-2},
int dy[12]={-1,-2,-2,-2,-2,-1,1,2,2,2,2,1};

【参考代码】

C代码:

#include <stdio.h>
#include <string.h>int dx[12]={-2,-2,-1,1,2,2,2,2,1,-1,-2,-2};  // 位移数组
int dy[12]={-1,-2,-2,-2,-2,-1,1,2,2,2,2,1};int main()
{int s[101][101];        // 记录最少步数 int que[10000][4]={0};  // 队列数组,存储可到达的点 int x1,y1;              // 黑马所在点 int x2,y2;              // 白马所在点int head=1,tail=1;      // 初始位置入队int i;int x,y;memset(s,-1,sizeof(s));         // s数组的初始化 que[1][1]=1;que[1][2]=1;que[1][3]=0;scanf("%d%d%d%d",&x1,&y1,&x2,&y2);  // 读入黑马白马的出发位置 // bfswhile(head<=tail)           // 若队列非空,则扩展队首结点 {for(i=0;i<12;i++)       // 枚举12个扩展方向{x=que[head][1]+dx[i];   // 计算马按 i 方向跳跃后的位置 y=que[head][2]+dy[i];if(x>0 && y>0){if(s[x][y]==-1)                        // 若(x,y)满足约束条件 {s[x][y]=que[head][3]+1;            // 计算(1,1)到(x,y)的最少步数 tail++;                            // (1,1)至(x,y)的最少步数入队 que[tail][1]=x;que[tail][2]=y;que[tail][3]=s[x][y];if(s[x1][y1]>0 && s[x2][y2]>0)    // 输出问题的解 {printf("%d\n%d\n",s[x1][y1],s[x2][y2]);return 0;}}}}head++;}return 0;
}

C++代码:

#include <iostream>
#include <queue>
#include <cstring>using namespace std;struct node
{int x,y;    // 坐标 int step;   // 到该结点的步数
};int dx[12]={-2,-2,-1,1,2,2,2,2,1,-1,-2,-2};   // 位移数组
int dy[12]={-1,-2,-2,-2,-2,-1,1,2,2,2,2,1};int main()
{int a[101][101];          // 记录最少步数 int que[10000][4]={0};    // 队列数组,存储可到达的点 int x1,y1;                // 黑马所在点 int x2,y2;                // 白马所在点 queue <node> q;           // 申请队列 node start,news;memset(a,-1,sizeof(a));   //a数组的初始化start.x=1;                // 初始化起点 start.y=1;start.step=0;   q.push(start);             // 起始点入队cin>>x1>>y1>>x2>>y2;       //读入白马和黑马的出发位置while(!q.empty())          //若队列非空,则扩展队首结点{start=q.front();q.pop();for(int d=0;d<12;d++)  //枚举12个扩展方向{int newx,newy,st;newx=start.x+dx[d];       //计算马按d方向跳跃后的位置newy=start.y+dy[d];if(newx>0 && newy>0 && newx<=100 && newy<=100){if(a[newx][newy]==-1)   //若(x,y)满足约束条件{a[newx][newy]=start.step+1;    //计算(1,1)到(x,y)的最少步数news.x=newx;news.y=newy;news.step=a[newx][newy];q.push(news);if(a[x1][y1]>0 && a[x2][y2]>0)   //输出问题的解{cout<<a[x1][y1]<<endl;cout<<a[x2][y2]<<endl;return 0;}}}}}return 0;
}

http://ybt.ssoier.cn:8088/problem_show.php?pid=1330

信息学奥赛一本通(1330:【例8.3】最少步数)相关推荐

  1. 【例8】合唱队形(《信息学奥赛一本通第五版》)

    /* [例8]合唱队形(<信息学奥赛一本通第五版>) http://ybt.ssoier.cn:8088/problem_show.php?pid=1264 [问题描述] N位同学站成一排 ...

  2. 信息学奥赛一本通 1278:【例9.22】复制书稿(book) | 洛谷 P1281 书的复制

    [题目链接] ybt 1278:[例9.22]复制书稿(book) 洛谷 P1281 书的复制 [题目考点] 1. 动态规划:线性动规 [解题思路] 该题可以抽象为:将由m个数字构成的序列分成k个子段 ...

  3. 【例1】 0/1背包《信息学奥赛一本通》【解法一】 02

    /* [例1] 0/1背包<信息学奥赛一本通>[解法一] 02 http://ybt.ssoier.cn:8088/problem_show.php?pid=1267 */ #includ ...

  4. 信息学奥赛一本通 2021:【例4.6】最大公约数

    [题目链接] ybt 2021:[例4.6]最大公约数 [题目考点] 1. while循环 2. 求最大公约数 辗转相减法 辗转相除法 [解题思路] 解法1:枚举 取较小数字,从该数字的值开始从大到小 ...

  5. 信息学奥赛一本通(2032:【例4.18】分解质因数)

    2032:[例4.18]分解质因数 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 582     通过数: 376 [题目描述] 把一个合数分解成若干个质因数乘积 ...

  6. 信息学奥赛一本通——2062:【例1.3】电影票

    2062:[例1.3]电影票 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 57341     通过数: 34230 [题目描述] 已知一位小朋友的电影票价是10 ...

  7. 信息学奥赛一本通1267:【例9.11】01背包问题(二维dp与滚动数组优化)

    [题目描述] 一个旅行者有一个最多能装 MM 公斤的背包,现在有 nn 件物品,它们的重量分别是W1,W2,...,WnW1,W2,...,Wn,它们的价值分别为C1,C2,...,CnC1,C2,. ...

  8. 信息学奥赛一本通C++语言-----2036:【例5.3】开关门

    [题目描述] 宾馆里有n(2≤n≤1000)n(2≤n≤1000) 个房间,从1∼n1∼n 编了号.第一个服务员把所有的房间门都打开了,第二个服务员把所有编号是22 的倍数的房间"相反处理& ...

  9. 信息学奥赛一本通——2068:【例2.6】鸡兔同笼

    大家好(๑╹◡╹)ノ" 这里是小蒟蒻 一天没更新了呢! 今天给大家带来<信息学奥赛一本通--2068:[例2.6]鸡兔同笼> 题目: 2068:[例2.6]鸡兔同笼 时间限制: ...

  10. 信息学奥赛一本通C++语言-----2048:【例5.18】串排序

    [题目描述] 对给定的n(1≤n≤20)n(1≤n≤20)个国家名(国家名字长度不超过2020),按其字母的顺序输出. [输入] 第一行为国家的个数nn: 以下nn行为国家的名字. [输出] nn行, ...

最新文章

  1. python开发环境anaconda_搭建Python开发环境,用Anaconda + PyQt + Pycharm
  2. 【术语扫盲】SKD 半散装件
  3. DNS详解: A记录,子域名,CNAME别名,PTR,MX,TXT,SRV,TTL
  4. MATLAB快速拟合二组数据
  5. 中关键字 表示空类型_C语言数据类型
  6. 牛客14607 递推(矩阵快速幂构造)
  7. SQL2005删除用户的时候,产生“数据库主体在该数据库中拥有架构,无法删除”的解决办法...
  8. 无法解析的外部符号+_mysql_fetch_row_vs连接mysql出现以下错误,求解答,谢谢,不胜感激...
  9. 数据中心智能化运维之路
  10. Abp vnext 特征(Features)
  11. zookeeper:Too many connections 故障处理记录
  12. [数据集]新浪微博数据集MicroblogPCU
  13. 【图像融合】基于matlab GUI像素点图像融合【含Matlab源码 783期】
  14. selenium学习第一步(firefox安装firebug和firepath插件)
  15. 带你玩转 3D 检测和分割(一):MMDetection3D 整体框架介绍
  16. python编写安装脚本_ido-Python 安装脚本包
  17. 超文本传输协议 - 白话篇
  18. 数据库之考勤管理系统
  19. 盘点营销策划案例之2019年沙雕广告!
  20. linux DRM/KMS 测试工具 modetest、kmscude、igt-gpu-tools (一)

热门文章

  1. Linux Shell 之 我的第一个Shell程序
  2. cocos2d-x多分辨率自适配及因此导致的CCListView的bug修复
  3. 秒杀奥斯卡的“第四块广告牌”就在你身边!
  4. LwIP之协议栈接口
  5. windows录屏_电脑自带录屏软件怎么打开?详细操作教程
  6. 太真实了!程序员之间的鄙视链...
  7. 别再用Else语句写代码了!
  8. 如何领导团队做好技术债管理?
  9. JEECG Word模板导出教程
  10. 在Maven+Spring项目中使用Node.js的Gulp进行前端自动化构建