首页 > 代码库 > 象棋将帅问题

象棋将帅问题

《编程之美》第二个问题,将帅位置的组合,要求只能使用一个变量。

问题本身很简单,但是加上要求限制之后(只能使用一个变量)就需要深入思考这个变量该存储什么内容了,仔细思考,将A的位置为9选1有9种可能,帅B的位置也为9选1有9种可能,二者组合共有81种可能,所以用一个能存够81个不同元素的byte类型即可搞定。

 a0a1a2a3a4a5a6a7a8
b0012345678
b191011121314151617
b2181920212223242526
b3272829303132333435
b4363738394041424344
b5454647484950515253
b6545556575859606162
b7636465666778697071
b8727374757677787980

使用一个循环遍历这81中可能,从中排除不能共存的位置即可,那么问题就该集中在如何排除不能共存的位置,比如a0和b0,b3,b6是不能共存的,那么也就是0,27,54需要被排除在外,我们用site代表将帅的位置组合,x代表将的位置,y代表帅的位置那么x+9*y=site,并且(x=[0-8],y=[0-8]),那么当x=0,3,6时y!=0,3,6以此类推,需要排除掉的情况就是site/9%3 == site%9%3。

/** * A        a0 a1 a2 *          a3 a4 a5 *          a6 a7 a8 * * B        b0 b1 b2 *          b3 b4 b5 *          b6 b7 b8 */public class ABStrike {    public static void main(String[] args) {        byte site = 0;        for (site = 0; site < 81; site++) {            if (site/9%3 == site%9%3)                continue;            System.out.println("A:" + site%9 + " B:" + site/9);        }    }}

 

象棋将帅问题