棋盘上的距离

问题描述
国际象棋的棋盘是黑白相间的 8 * 8 的方格,棋子放在格子中间。如图所示:

王、后、车、象的走子规则如下:

? 王:横、直、斜都可以走,但每步限走一格。
? 后:横、直、斜都可以走,每步格数不受限制。

? 车:横、竖均可以走,不能斜走,格数不限。

? 象:只能斜走,格数不限。

写一个程序,给定起始位置和目标位置,计算王、后、车、象从起始位置走到目标位置
所需的最少步数。

输入数据

第一行是测试数据的组数 t(0 <= t <= 20)。以下每行是一组测试数据,每组包括棋盘 上的两个位置,第一个是起始位置,第二个是目标位置。位置用"字母-数字"的形式表示, 字母从"a"到"h",数字从"1"到"8"。

输出要求

对输入的每组测试数据,输出王、后、车、象所需的最少步数。如果无法到达,就输出 "Inf".

输入样例

2
a1 c3

f5 f8

输出样例

2 1 2 1

3 1 1 Inf

解题思路:

1 先考虑特例:

(1)何时会出新inf。易知王车后可以到达任何一点。但是象不能到达任何一点。

  可以这么考虑,初始的象如果是白色,那么不管其如何移动仍然会是白色。反之亦然。

具体的数学表达为x-y的奇偶性

2 设横向距离为x 纵向距离为y 那么

 (1)因为王斜走一步等于先横一步再竖一步,所以王斜走的越多越好,王斜走最多为min(x,y),为达到终点还要走|x-y|

 所以王最小的距离为 min(x,y)+|x-y|=max(x,y)

(2)车只有横移和竖移,所以如果在一条线上,那么为1 否则为2

(3)皇后 当 x=0 or y=0 一步到达 当 y=x 一步到达

其他情况 两步

(4) 象 只能斜走 象每走一步,纵横坐标增加减少相同 但是差值的奇偶性不变 所以通过此值判断是否可以到达

如果x=y则一步 否则两步

c++实现:

#include <iostream>
using namespace std;

int main() {
    int n;
    cin>>n;

    char start[3];
    char end[3];
    for(int i=0;i<n;i++)
    {
        cin>>start>>end;

        int x=abs(start[0]-end[0]);
        int y=abs(start[1]-end[1]);
        //does not need to move
        if(x==0&&y==0)
        {
            cout<<"0 0 0 0"<<endl;
            continue;
        }
        //for king
        cout<< (x>y?x:y)<<" ";

        //for queen
        cout<<(x==0||y==0||x==y?1:2)<<" ";

        //for car
        cout<< (x==0||y==0?1:2)<<" ";

        //for ele
        if((x-y)%2==0)
        {
            if(x==y)
            {
                cout<<"1"<<endl;
            }
            else
            {
                cout<<"2"<<endl;
            }
        }
        else
        {
            cout<<"Inf"<<endl;
        }

    }

}
时间: 2024-10-17 15:25:33

棋盘上的距离的相关文章

读书-算法《程序设计导引及在线实践》-简单计算题2:棋盘上的距离

题目:棋盘上的距离 求国际象棋中王.后.车.象从起始位置到目标位置所需的最少步骤. 行走规则如下: 王:横.竖.斜都可以走,但每步只能走一格. 后:横.竖.斜都可以走,但每步格数不限. 车:横.竖都可以走,不能斜着走,每步格数不限. 象:只能斜着走,格数不限. 我没有下过国际象棋,但题目中这四种角色的行走规则.把题目翻译一下,在一个8*8 的矩阵里面,按照给定的规则从一个点到另一个点的最近路径,好像也不用翻译,题目就是这么说的. 代码实现如下: #include <stdio.h> #incl

【蓝桥杯竞赛】棋盘上的距离

思路: 将几盘看作二维坐标,始点与终点距离用xDistance yDistance组成,王 后 车 象以不同的的情况考虑. 源码: #include<stdio.h>#include<math.h>int main(){    //测试数据组数    int nGroup = 0;    scanf("%d",&nGroup);    for(int i = 0; i < nGroup; i++)    {        char begin[5]

棋盘上的距离[POJ-1657]

POJ Monthly 2004.5.15 Liu [email protected] 时间限制 1000ms 内存限制 10MB 这道题应该分开考虑.虽然全部用BFS也是可以的,但是显然对于皇后和车是多余的了. 对于皇后和车来说,必然能到,而且最多只需要两步就能到.因此只需要判断是不是在其一步能到的范围,如果不是,则输出2.判断车的范围很简单,只要看横坐标或者纵坐标是不是相等就行了.而判断王后,除了判断垂直和水平能不能到,还要判断斜向能不能到.可以把棋盘看作一个坐标系,每一个位置当作一个整数点

计算两点间的距离

计算两点间的距离 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 208295    Accepted Submission(s): 72641 Problem Description 输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离. Input 输入数据有多组,每组占一行,由4个实数组成,分别表示x1,y1,x2,y

百度距离谷歌何止一个太平洋的距离

作为一个程序员,如果不使用谷歌,那么你所查阅的资料几乎完全相同. 百度和谷歌何止一个太平洋的距离. 首先就是广告,百度现在的广告已经达到了让人无法忍受的地步了.你键入关键字进行搜索,出来的第一个或前几个答案都是百度推广的,都是非所答的结果. 先说说技术上: 作者:Kenny Chao 链接:http://www.zhihu.com/question/22447908/answer/21435705 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 搜索引擎需要对抓

学术休假期 项目4-点和距离

问题及代码: 读程序,写出函数的定义,注意其中枚举类型的用法 /* *Copyright (c)2014,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:点和距离.cpp *作 者:冷基栋 *完成日期:2015年2月26日 *版 本 号:v1.0 */ #include <iostream> #include <Cmath> using namespace std; enum SymmetricStyle {axisx,axisy,point}

csu 1503: 点到圆弧的距离-湖南省第十届大学生计算机程序设计竞赛

就是--判断p与圆心的连线与圆的交点在不在圆弧上,在就是它到p的距离,不在就是p跟端点的最短距离 #include<iostream> #include<map> #include<string> #include<cstring> #include<cstdio> #include<cstdlib> #include<cmath> #include<queue> #include<vector>

捷尔特电动车与骗子保持距离e

解放后,由于刘大肚既是大地主又是资本家,那可是典型的剥削阶级,被限制了人身自由,那是大会批了小会批,在一次运动中,政府发动贫下中农诉苦,作为被剥削阶级代表,孙大春被迫说了几句对刘大肚不利的话,(其实是当时工作组的组长逼迫他这样说的,如果不这样说,就把他家的成分变成富农,那哪能行呢,划成了富农,后代上学当兵都成问题.)这可不得了,有人作证了,为此,刘大肚被连着游斗了几天,最后终于无法忍受折磨,在一个风雨交加的夜里上吊自尽了.当时,刘有根还在省城读书,也受牵连被学校开除了.刘有根是何等的聪明啊,他服

mysql 下 计算 两点 经纬度 之间的距离

公式如下,单位米: 第一点经纬度:lng1 lat1 第二点经纬度:lng2 lat2 round(6378.138*2*asin(sqrt(pow(sin( (lat1*pi()/180-lat2*pi()/180)/2),2)+cos(lat1*pi()/180)*cos(lat2*pi()/180)* pow(sin( (lng1*pi()/180-lng2*pi()/180)/2),2)))*1000) 例如: SELECT store_id,lng,lat, ROUND(6378.13