象棋将帅问题

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

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

  a0 a1 a2 a3 a4 a5 a6 a7 a8
b0 0 1 2 3 4 5 6 7 8
b1 9 10 11 12 13 14 15 16 17
b2 18 19 20 21 22 23 24 25 26
b3 27 28 29 30 31 32 33 34 35
b4 36 37 38 39 40 41 42 43 44
b5 45 46 47 48 49 50 51 52 53
b6 54 55 56 57 58 59 60 61 62
b7 63 64 65 66 67 78 69 70 71
b8 72 73 74 75 76 77 78 79 80

使用一个循环遍历这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);
        }
    }
}
------------------------------- 问道,修仙 -------------------------------
原文地址:https://www.cnblogs.com/elvalad/p/4117194.html