Author: Fox

晚上没有加班,打游戏打到9点过,后面就又看了一道《编程之美》的题目《中国象棋将帅问题》。

题目:下过中国象棋的朋友都知道,双方的“将”和“帅”相隔遥远,并且它们不能照面。在象棋残局中,许多高手能利用这一规则走出精妙的杀招。假设棋盘上只有“将”和“帅”二子(如图1-3所示)(为了下面叙述方便,我们约定用A表示“将”,B表示“帅”):

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所有合法位置。要求在代码中只能使用一个变量。

在纸上画了半天,Soft从台湾给带的长寿都让我抽完了,总算对得起这会儿工夫……

我的思路大致如下:

1) 只能使用一个变量nNum ==> 只能使用一个循环,nNum只能用来表示A、B位置的组合,nNum最大为9×9-1=80;

2) 如何用nNum表示一个A、B位置的组合?

下图表示A(红色)、B(蓝色)所在位置:

6

7

8

3

4

5

0

1

2

6

7

8

3

4

5

0

1

2

以nNum%9表示A的位置,nNum/9表示B的位置,如nNum==15,A==6,B==1。

3) 如何确定A、B位置的合法性?

规则都指定了,合法性的确定也就很简单了:A%3 != B%3。

OK,剩下的输出就很简单了,为了好看一点,这里希望直接按题目给的图表示出A、B的位置,如:“A:d10, B:e3”,还有颜色:D。

A的行号:A/3+8;

A的列号:A%3+d;

B的行号:B/3+1;

B的列号:B%3+d;

代码如下(注释掉的部分只是为了输出更“漂亮”一点):

1 #include2 //#include 3 4 //HANDLE hStdout;5 //CONSOLE_SCREEN_BUFFER_INFO csbiInfo;6 //WORD wOldColorAttrs;7 8 int_tmain(intargc, _TCHAR*argv[])9 {10 //hStdout = GetStdHandle(STD_OUTPUT_HANDLE);11 //GetConsoleScreenBufferInfo(hStdout, &csbiInfo);12 //wOldColorAttrs = csbiInfo.wAttributes;13 14 intnNum=81;//nNum表示所有位置(含非法),故nNum = 3 * 3 * 3 * 315 while( nNum--)16 {17 if( nNum%9%3!=nNum/9%3)18 {19 //SetConsoleTextAttribute(hStdout, FOREGROUND_RED | FOREGROUND_INTENSITY);20 printf("A:%x%02d", nNum%9%3+0xd, nNum%9/3+8);21 //SetConsoleTextAttribute(hStdout, FOREGROUND_BLUE | FOREGROUND_INTENSITY);22 printf("B:%x%02d", nNum/9%3+0xd, nNum/9/3+1);23 }24 if(!(nNum%9) )25 printf("\n");26 };27 printf("\n");28 //SetConsoleTextAttribute(hStdout, wOldColorAttrs);29 return0;30 }

输出:

PS: 刚写完,没有来得及总结更多,急着向LP炫耀。但上面的思路应该比较清晰了,也不管书上的答案了,反正我感觉我这点代码效率应该也不会低到哪儿吧:-)?

中国象棋将帅问题java_编程之美:中国象棋将帅问题相关推荐

  1. 编程之美2.10:寻找数组中的最大值和最小值

    编程之美2.10: 对于一个有N个整数组成的数组,需要比较多少次才能把最大值和最小值找出来呢? 算法的思想是: 分而治之 测试数据:---------------------------------- ...

  2. 编程之美2.1 求二进制中1的个数

    最近一段的时间,一直在看编程之美之类的算法书籍,刚开始看编程之美,感觉到难度太大,有时候也不愿意去翻动这本书,不过,经过一段时间的修炼,我也彻底的喜欢上这本书了, 书中的算法涉及到很多方面,树,链表, ...

  3. 2017“编程之美”终章:AI之战勇者为王

    编者按:8月15日,第六届微软"编程之美"挑战赛在选手的火热比拼中圆满落下帷幕."编程之美"挑战赛是由微软主办,面向高校学生开展的大型编程比赛.自2012年起, ...

  4. Java 并发编程之美:并发编程高级篇之一-chat

    借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作 ...

  5. Java 并发编程之美:并发编程高级篇之一

    借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作 ...

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

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

  7. 编程之美:编程判断两个链表是否相交

    1.问题描述 给出两个单向链表的头指针,比如h1.h2,判断两个链表是否相交.编程之美为了简化问题,假设两个链表均不带环. 如下图: 2.分析与解法 解法一:直观法,先判断第一个链表的每个节点是否在第 ...

  8. c语言找出递增子数组的长度,编程之美2.16 数组中最长递增子序列的长度

    改进的方法看的头大了却还是不清楚,哎...搞算法的苦啊,纠结啊. 编程之美这本书里面就有关于这道题的一些解法,求一个一位数组中的最长序列的长度.例如,在序列1,3,2中,最长递增序列是1,3. 这道题 ...

  9. 二叉树中节点的最大的距离(编程之美3.8)

    问题来源:<编程之美>3.8 求二叉树节点的最大距离 如果把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两个节点之间的个数. 写一个程序求一 ...

最新文章

  1. 如何用 Python 分析 14 亿条数据?
  2. STL容器的基本特性和特征
  3. 解决eclipse+MAVEN提示One or more constraints have not been satisfied.的问题
  4. 北斗导航 | 利用模拟卫星星座估计GNSS接收机位置
  5. mac下在eclipse中怎样清除/切换svn
  6. Json string to object debug - json字符串转Java对象的处理调试
  7. React Native实现js调用安卓原生代码
  8. 羞羞的Python模块包
  9. ofo在北京上线有桩模式,违规最高罚20元
  10. 指尖的流连.9月13
  11. auto cad 打印颜色变浅_CAD初学者最容易忽视的CAD打印线宽问题,你“中枪”了吗?...
  12. redhat 完全卸载mysql_Linux完全卸载MySQL
  13. 传教士与野人渡河问题(使用C++解决)
  14. Duplicate问题
  15. urho3d中3d音效SoundSource3D使用的注意
  16. 服务器清理文件,裸金属服务器清理文件
  17. [附源码]Python计算机毕业设计大学生学科竞赛管理系统
  18. Adobe官方旗舰店,现已上线“Adobe国际认证”专家证书
  19. Unity中物体抛物线的实现
  20. 登录令牌 Token 介绍

热门文章

  1. 王树森:学 DRL 走过的弯路太多,想让大家避开
  2. 【经典】思科、华为路由器交换机模拟器大全及教程
  3. Delphi使用ADOconnection连接mysql数据库时的Connectionstring问题
  4. Centos 安装nvidia显卡驱动,nouveau驱动冲突问题,The Nouveau kernel driver is currently in use by your system
  5. AtCoder题解 —— AtCoder Beginner Contest 182 —— D - Wandering
  6. 异常之IllegalAccessException
  7. 微信小程序给电商行业创业的新曙光
  8. Houdini实现AO效果
  9. SVN客户端TortoiseSVN基本使用方法步骤-初人指南
  10. GitHub 自动下载 Release 固件