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

来源:互联网 发布:如果个人发现网络运营 编辑:程序博客网 时间:2024/05/01 04:27

题目:下过中国象棋的朋友都知道,双方的"将"和"帅"相隔遥远,并且它们不能照面。在象棋残局中,许多高手能利用这一规则走出精妙的杀招。假设棋盘上中只有"将"和"帅"二子(如图1所示,注:此图仅作示意,原图请见《编程之美:微软技术面试心得》一书)(为了下面叙述方便,我们约定用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所有合法位置。要求在代码中只能使用一个变量

文中,作者给出了三种解法,都很巧妙,第一种用到了宏的强大,第二个最为精妙,第三个感觉有点投机,用结构体,那我还能用类啦~!。主要有两点需要注意的地方,一个是如何简单地表示每个格点的位置。在文中,采用了用1~9的数字按照行优先的顺序进行表示(如图2所示),这样,只需要用模余运算就可以得到当前格点列号,从而判断A、B是否互斥。

1-9表示将帅坐标

第一种:

原创粉丝点击