棋盘上的距离

问题描述:

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

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

以下是思路分析

  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. Swift—重写-备

    ========================= 重写实例属性 我们可以在子类中重写从父类继承来的属性,属性有实例属性和静态属性之分,他们在具体实现也是不同的. 实例属性的重写一方面可以重写gett ...

  2. ubuntu安装使用kdevelop

    vim是好用,但是有时候操作不那么人性化,用一个ide可能感觉比较好,ubuntu下面比较好的c/c++ ide出名的有kdevelop,Qt等. kdevelop安装: sudo apt-get u ...

  3. js中()()问题

    var aa=function(){}(); var bb=(function(){})(); 今天被问到这个问题,这段js有撒区别. 总结一下,两个函数都是立即执行的意思.但是不同之处是执行的顺序, ...

  4. 【转】Everything中文绿色版在Win7/8用不了?

    原文网址:http://pcedu.pconline.com.cn/472/4727542.html 用过Everything的朋友应该都知道,Everything有两个版本,一个是安装版,另一个是E ...

  5. Linux桌面快捷方式建立方案

    Linux桌面快捷方式建立方案 以下以添加Eclips为例 在桌面上添加Eclips.desktop 文件,向其写入如下代码 [Desktop Entry] Name=Eclipse Comment= ...

  6. 记npm包开发全过程

    概述 为什么开发npm包? 如何开发? 如何写单元测试? package.json 如何发布模块? 如何使用? 为什么开发npm模块? NPM的全称是Node Package Manager,是一个N ...

  7. java——Arrays.asList()方法

    Arrays.asList() 是将数组作为列表 问题来源于: public class Test { public static void main(String[] args) { int[] a ...

  8. MyBatis的事务处理

    先来假设这样一个问题:如果数据库里面有一个用户表和一个作家表,那么当要添加一条数据到作家表中时,作家表的id必须是用户表中的其中一个id,因为作家一定也要是一个用户.这时就涉及到事务处理. 在上一篇博 ...

  9. Nginx各个配置块功能详解

    Nginx学习笔记-入门篇 nginx初探 ginx服务器是轻量级web服务器中广受好评的一款产品,常用功能有HTTP代理与反向代理(目前已支持七层与四层代理),负载均衡,web缓存. nginx配置 ...

  10. (转)利用ant在Mac 下自动化打包签名Android程序

    1.创建一个android项目 参数说明:-k /--package 为命名空间(包名)-a /--name 工程名-p /--path 项目 -t 为目标平台的版本编号 命令:./android c ...