"中国象棋将帅问题"的一种解法

在《编程之美:微软技术面试心得》一书中,看到这样一道"中国象棋将帅问题":

下过中国象棋的朋友都知道,双方的"将"和"帅"相隔遥远,并且它们不能照面。在象棋残局中,许多高手能利用这一规则走出精妙的杀招。假设棋盘上中只有"将"和"帅"二子(如图1所示,注:此图仅作示意,原图请见《编程之美:微软技术面试心得》一书)(为了下面叙述方便,我们约定用A表示"将",B表示"帅")。

图 1

A、B二子被限制在已方3×3的格子里运动。例如,在如上的表格里,A被正方形{d10,f10,d8,f8}包围,而B被正方形{d3,f3,d1,f1}包围。每一步,A、B分别可以横向或纵向移动一格,但不能沿对角线移动。另外,A不能面对B,也就是说,A和B不能处于同一纵向直线上(比如A在d10的位置,那么B就不能在d1、d2以及d3的位置上)。

请写出一个程序,输出A、B所有合法位置。要求在代码中只能使用一个变量。

(以上题目选自《编程之美:微软技术面试心得》)

在原文中,作者给出了三种解法,都很精彩。主要有两点需要注意的地方,一个是如何简单地表示每个格点的位置。在文中,采用了用1~9的数字按照行优先的顺序进行表示(如图2所示),这样,只需要用模余运算就可以得到当前格点列号,从而判断A、B是否互斥。

图 2 用1~9的数字表示A、B的坐标

另一个需要注意的地方是使用一个变量同时存储A、B两个子的位置信息。文中一种解法是一个byte类型的值前后两部分分别表示这两个位置,并给出一系列在byte变量上进行运算的做法,在代码中给出了不少相应的宏定义,代码量相对较多。而第二种解法的代码则很简单,不过其实现思路是怎样的,文中并未直接给出,代码如下:

BYTE i = 81;

while(i --)

{

if(i / 9 % 3 == i % 9 % 3)

continue;

printf("A = %d, B = %d /n",i / 9 + 1,i % 9 + 1);

}

结合文中的这两种解法,个人认为可以使用一个数的个位及十位数分别表示这两个子的位置信息(前提是棋子的位置只是1~9之间,即不超过一个位所能表示的数字范围),这样可以更为直观一些,在时间、空间复杂度上也不见得有所降低。

C++代码如下(在VS 2003中编译通过):

#include <iostream>

#include <windows.h>

using namespace std;

/*

算法:

1.只使用一个变量

2.将双方象棋的位置信息通过十进制数的个位及十位分别表示

3.不在同一列上的双方象棋相对位置为合法位置(通过模运算结果不同实现)

4.去掉个位是0的情况

*/

void main()

{

for(BYTE i = 11;i <= 99;i ++)

{

if(i / 10 % 3 != i % 10 % 3 && ((i % 10) != 0))

{

cout<<"("<<(i / 10)<<","<<(i % 10)<<")/n";

}

}

}

正如书中所言,"问题的本身并不复杂",其实,个人认为这几种解法在本质上是一样的(书中还有另一种解法),这里只是给出一点小想法,如各位还有其他想法或发现文中的不足之处,欢迎分享交流。

中国象棋将帅问题的一种解法相关推荐

  1. 中国象棋将帅问题java_编程之美读书笔记1.2——中国象棋将帅问题

    http://blog.csdn.net/pipisorry/article/details/36380669 问题:下过中国象棋的朋友都知道,双方的"将"和"帅&quo ...

  2. 编程之美- 中国象棋将帅问题

    2019独角兽企业重金招聘Python工程师标准>>> 问题描述: 在中国象棋规则中,将和帅规定只能在田字格中移动,且将和帅是不能碰面的,请求解出所有可能的符合规则的将帅位置. 限制 ...

  3. 中国象棋将帅问题(一)

    题记--开始学习编程之美,第一次写博客记录自己的编程心得,希望自己不断进步,做一个踏实的codeman.通过博客能够记录每次的编程体会,将一些重要的知识点进行标注,便于日后查看复习.如果,有朋友能够从 ...

  4. 编程之美——1.2 中国象棋将帅问题(转)

    下面是书中给出的第二个方法: #include<stdio.h> #define BYTE unsigned char int main(void) { BYTE i = 81; whil ...

  5. 编程之美 1.2 中国象棋将帅问题

    编程之美 1.2 中国象棋将帅问题 版权所有, 禁止转载, 如有需要, 请站内联系. 本文地址: http://blog.csdn.net/caroline_wendy/article/details ...

  6. 编程之美-中国象棋将帅问题

    废话不多说,上代码 代码 /************************************************************************编程之美1.2中国象棋将帅的 ...

  7. 中国象棋将帅问题java_编程之美:中国象棋将帅问题

    Author: Fox 晚上没有加班,打游戏打到9点过,后面就又看了一道<编程之美>的题目<中国象棋将帅问题>. 题目:下过中国象棋的朋友都知道,双方的"将" ...

  8. 中国象棋将帅问题的另类解法

    编程之美里有个将帅问题蛮有意思的,该问题的具体描述是:(根据中国象棋的基本原则)在只有双的将帅棋盘上,找出所有双方可以落子的位置(将帅不能碰面),但只能使用一个变量. 解法一般也就是 循环然后判断去除 ...

  9. 【编程之美】中国象棋将帅问题

    问题描述 在中国象棋里将和帅是不能碰面的,如下图所示,当将位于d10时,帅就不能在d1,.d2.d3.请写一个程序,输出将.帅所有的合法位置.要求在代码中仅用一个变量. 如果只是输出将.帅的合法位置, ...

最新文章

  1. RDKit | 基于RDKit输出分子结构图(Image)的方法
  2. Listen error 错误和 limit of inotify watches was reached
  3. 安卓 listView 组件的使用
  4. linux shell的输出效果修改方法(界面颜色)
  5. 简易的素描图片转换流程与实现
  6. InnoDB引擎与MyIASM的一点总结
  7. phone6s home键按不动了怎么办 苹果6s home键按不动解决方法
  8. python生成器迭代_二十、深入Python迭代器和生成器
  9. thymeleaf select_SpringBoot整合thymeleaf简单的CRUD
  10. Ajax-jsonp跨域
  11. 第23章 排序算法(包括merge等)
  12. Winform打包-NSIS 检测.NetFramework版本(亲测可用)
  13. 关于EPOLL的ET和LT模式的深入理解
  14. websocket 发送多条消息如何判断全部接收_Websocket的分布式集群开发及部署
  15. 32位汇编语言helloworld_编程语言发展70年,50种不同语言输出Hello World,你知多少?...
  16. SAP常用TCODE收藏
  17. CAD2010安装→注册
  18. wgc84 笛卡尔_WGS84椭球下的UTM坐标与Clarke80椭球下的兰勃特坐标转换方法研究
  19. 【小程序开发之制作首页】
  20. 聊聊短信接口攻击的防范方案

热门文章

  1. Windows Media Player接口
  2. 7-13 打印沙漏 (20 分) 本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
  3. 解决win7 Windows USB无法驱动/驱动错误/该设备无法启动。(代码10)
  4. Java 获得纯数字格式的时间
  5. 周杰伦《依然范特西》主打歌曲《千里之外》
  6. 中老年计算机办公网上培训,中老年电脑免费培训(第1讲).ppt
  7. 用计算机解锁ipad密码忘了怎么办,忘记iPad开机密码怎么办 iPad开机密码忘记了解决方法【详解】...
  8. 场外交易是什么?你对它的了解有多少?
  9. laravel-admin登录页面进不去
  10. html文字阴影php中文网,文字阴影text-shadow属性是什么?text-shadow属性详解