棋盘上的距离

问题描述:

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

  • 王:横、直、斜都可以走,但每步限走一格。
  • 后:横、直、斜都可以走,每步格数不受限制。
  • 车:横、竖均可以走,不能斜走,格数不限。
  • 象:只能斜走,格数不限。

以下是思路分析

  1. 王,王的情况最复杂

    1. X与Y的差相等,那么是 x0 与 x1 的差值;
    2. X的差与Y的差不等,分两大步完成:
      1. 第一大步,直走到最近一个与目标位置成对角线的位置。
      2. 第二大步,沿对角线走完。
  2. 后,最多只需两步就能完成,最少一步。

    1. 一步的情况:

      1. 起始位置与目标位置X,Y之一相等;
      2. 起始位置与目标位置X,Y差相同。
    2. 其他都是二步
  3. 车,

    1. X,Y之一相等,一步
    2. X,Y均不同,二步
  4. 象,象存在不可到达的情况

    1. 象的起始位置两个坐标值与目标位置两个坐标值差相等的情况下,一步
    2. 否则,只有在差的和是偶数的情况下可到达,两步
    3. 其他情况不可到达。

以下是程序:

public class Grids1657 {

	public static void main(String[] args) {
// TODO Auto-generated method stub
Grids1657 grids = new Grids1657();
@SuppressWarnings("resource")
Scanner sc = new Scanner(System.in);
System.out.println("输入数据的组数:");
int n = sc.nextInt(); // 数据组数
sc.nextLine();
for (int i = 0; i < n; i++) {
System.out.println("第" + (i + 1) + "组数据:");
String inputData = sc.nextLine();
char[] charData = inputData.toCharArray();
// System.out.println(inputData.length());
int a, b, c, d = 0;
a = grids.TransInt(charData[0]);
b = grids.TransInt(charData[1]);
c = grids.TransInt(charData[3]);
d = grids.TransInt(charData[4]);
System.out.println("King:" + grids.King(a, b, c, d));
System.out.println("Queen:" + grids.Queen(a, b, c, d));
System.out.println("Vehicle:" + grids.Vehicle(a, b, c, d));
if (grids.Prime(a, b, c, d) == 3)
System.out.println("Prime:Inf");
else
System.out.println("Prime:" + grids.Prime(a, b, c, d));
}
System.out.println("程序结束!");
} private int Queen(int x0, int y0, int x1, int y1) {
int result = 0;
if ((x0 - x1 == y0 - y1) || x0 == x1 || y0 == y1) {
result = 1;
} else {
result = 2;
}
return result;
} private int King(int x0, int y0, int x1, int y1) {
int step1,step2 = 0;
int result = 0;
if (x0 - x1 == y0 - y1)
result = Math.abs(x0 - x1);
else if (Math.abs(x0 - x1) < Math.abs(y0 - y1)) {
step1 = Math.abs(Math.abs(y0 - Math.abs(y0 - (x1 - x0))));
step2 = Math.abs(x1 - x0);
result = step1 + step2;
} else {
step1 = Math.abs(Math.abs(x0 - Math.abs(x0 - (y1 - y0))));
step2 = Math.abs(y1 - y0);
result = step1 + step2;
}
return result;
} private int Vehicle(int x0, int y0, int x1, int y1) {
int result = 0;
if (x0 == x1 || y0 == y1) {
result = 1;
} else
result = 2;
return result; } private int Prime(int x0, int y0, int x1, int y1) {
int result = 0;
if (x0 - x1 == y0 - y1) {
result = 1;
} else if (0 == (x0 - x1 + y0 - y1) % 2) {
result = 2;
} else
result = 3; // 不可到达,要转成“Inf”输出
return result; } private int TransInt(char ch) {
int ch03 = 0;
switch (ch) {
case ('a'):
ch03 = 1;
break;
case ('b'):
ch03 = 2;
break;
case ('c'):
ch03 = 3;
break;
case ('d'):
ch03 = 4;
break;
case ('e'):
ch03 = 5;
break;
case ('f'):
ch03 = 6;
break;
case ('g'):
ch03 = 7;
break;
case ('h'):
ch03 = 8;
break;
case ('1'):
ch03 = 1;
break;
case ('2'):
ch03 = 2;
break;
case ('3'):
ch03 = 3;
break;
case ('4'):
ch03 = 4;
break;
case ('5'):
ch03 = 5;
break;
case ('6'):
ch03 = 6;
break;
case ('7'):
ch03 = 7;
break;
case ('8'):
ch03 = 8;
break;
default:
break;
}
return ch03;
}
}

棋盘上的距离 - Grids1657的更多相关文章

  1. OJ题解记录计划

    容错声明: ①题目选自https://acm.ecnu.edu.cn/,不再检查题目删改情况 ②所有代码仅代表个人AC提交,不保证解法无误 E0001  A+B Problem First AC: 2 ...

  2. BZOJ2281:[SDOI2011]黑白棋(博弈论,组合数学,DP)

    Description 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色不同. 小 ...

  3. P2060 马步距离(洛谷)

    我们无论遇到什么困难,都不要拖,微笑着面对他,战胜拖延的最好方法就是面对拖延. 今天又拖延了…… 早晨听完老师讲课,本想做一道题练练手的,结果因为懒,瘫了一上午.最后在固定的刷题时间去面对了这道题,然 ...

  4. iOS之计算上次日期距离现在多久, 如 xx 小时前、xx 分钟前等

    /**  *  计算上次日期距离现在多久  *  *  @param lastTime    上次日期(需要和格式对应)  *  @param format1     上次日期格式  *  @para ...

  5. 挑子学习笔记:对数似然距离(Log-Likelihood Distance)

    转载请标明出处:http://www.cnblogs.com/tiaozistudy/p/log-likelihood_distance.html 本文是“挑子”在学习对数似然距离过程中的笔记摘录,文 ...

  6. 字符串编辑距离(Levenshtein距离)算法

    基本介绍 Levenshtein距离是一种计算两个字符串间的差异程度的字符串度量(string metric).我们可以认为Levenshtein距离就是从一个字符串修改到另一个字符串时,其中编辑单个 ...

  7. [LeetCode] Rearrange String k Distance Apart 按距离为k隔离重排字符串

    Given a non-empty string str and an integer k, rearrange the string such that the same characters ar ...

  8. [LeetCode] Shortest Word Distance III 最短单词距离之三

    This is a follow up of Shortest Word Distance. The only difference is now word1 could be the same as ...

  9. [LeetCode] Shortest Word Distance II 最短单词距离之二

    This is a follow up of Shortest Word Distance. The only difference is now you are given the list of ...

随机推荐

  1. android 让一个控件按钮居于底部的几种方法

    android 让一个控件按钮居于底部的几种方法1.采用linearlayout布局:android:layout_height="0dp" <!-- 这里不能设置fill_ ...

  2. 安卓u8800刷机

    一篇非常好的帖子:http://bbs.anzhi.com/thread-5113728-1-1.html 虽然不是什么大神,不过在两个QQ群里和这里解答过N多刷机和ROOT中遇到的问题了...而且伸 ...

  3. NERDTree这个插件的用法简介

    事情是这样子的,想做做李治军老师班的操作系统实验,但是Linux上的gedit太简陋了(这个简陋程度堪比Windows环境下的"记事本"),被杨世祺大神嘲笑了.我心想既然在linu ...

  4. Raid1源代码分析--Barrier机制

    本想就此结束Raid1的专题博客,但是觉得Raid1中自己构建的一套barrier机制的设计非常巧妙,值得单独拿出来分析.它保证了同步流程和正常读写流程的并发性,也为设备冻结/解冻(freeze/un ...

  5. erlang mnesia 数据库查询

    Mnesia是一个分布式数据库管理系统,适合于电信和其它需要持续运行和具备软实时特性的Erlang应用,越来越受关注和使用,但是目前Mnesia资料却不多,很多都只有官方的用户指南.下面的内容将着重说 ...

  6. 【KMP】剪花布条

    KMP算法 又水了一题.算是巩固复习吧. Problem Description 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽 ...

  7. MySQL事务处理2

    MySQL5.X 都已经发布好久了,但是还有很多人认为MySQL是不支持事务处理的,这不得不怪他们是孤陋寡闻的,其实,只要你的MySQL版本支持BDB或 InnoDB表类型,那么你的MySQL就具有事 ...

  8. (转)Linux下apache限速和限制同一IP连接数的实现

    单位有一台DELL的服务器,4核双CPU,4G内存,1TB的存储空间,闲来无事,申请了域名http://www.zxzy123.cn,做了个网站,本以为用这样的配置做个下载站是绰绰有余了,没想到上线没 ...

  9. DLNA介绍(包含UPnP,2011/6/20 更新)

    这部分的内容大多来源于网络及官方文档,依照自己的翻译理解整理所成.东西比較多,从头慢慢看还是能够懂个大概的. 文件夹: 一.DNLA的建立 二.DLNA的成员 三.DLNA标准的制定 四.DLNA的设 ...

  10. [Redux] React Todo List Example (Toggling a Todo)

    /** * A reducer for a single todo * @param state * @param action * @returns {*} */ const todo = ( st ...