编程之美

来源:互联网 发布:linux alias 参数 编辑:程序博客网 时间:2024/06/05 20:29

问题导读:


在一把象棋的残局中,象棋双方的将帅不可以相见,即不可以在中间没有其他棋子的情况下在同一列出现。而将、帅各被限制在己方的3*3的格子中运动。相信大家都非常熟悉象棋的玩法吧,这里就不详细说明游戏规则了。
用A、B代表将和帅,请写出一个程序,输出A、B所有合法的位置。要求在代码中只能用一个变量。


解决方案:


注:我这里处理 4*4 的两个矩阵


1. 

package Chapter1;public class Func_1_2_1 {    // int的bit大小的一半    int half_bits_length;    // 32个1    int full_mask;    // 边长    double edge;    // 周长    double girth;    public Func_1_2_1(int half_bits_length, int full_mask, double edge) {        this.half_bits_length = half_bits_length;        this.full_mask = full_mask;        this.edge = edge;        this.girth = Math.pow(edge, 2);    }    /*    规则:    & 0 -> 0    & 1 -> 本身    | 0 -> 本身    总结:    1.1 l &0&1 再|(<<)    1.2 r &1&0 再|    2.1 l &1&0 再移位    2.2 r &0&1     */    // 返回01    int lMask() {        return this.full_mask >> this.half_bits_length;    }    // 返回10    int rMask() {        return this.full_mask << this.half_bits_length;    }    // 将i的左边赋值为n    int lSet(int i, int n) {        return ((i & lMask()) | (n << this.half_bits_length));    }    // 将i的右边赋值为n    int rSet(int i, int n) {        return ((i & rMask()) | n);    }    // 得到i的左侧的值    int lGet(int i) {        return (i & rMask()) >> this.half_bits_length;    }    // 得到i的右侧的值    int rGet(int i) {        return (i & lMask());    }    public static void main(String []args) {        Func_1_2_1 f = new Func_1_2_1(Integer.SIZE/2, Integer.MAX_VALUE, 4);        int i = 0;        for(i = f.lSet(i, 1); f.lGet(i) <= f.girth; i = f.lSet(i, (f.lGet(i) + 1))) {           for(i = f.rSet(i, 1); f.rGet(i) <= f.girth; i = f.rSet(i, (f.rGet(i) + 1))) {               if(f.lGet(i) % f.edge == f.rGet(i) % f.edge) {                   System.out.println("A = " + f.lGet(i) + " B = " + f.rGet(i));               }           }       }    }}


2.

package Chapter1;public class Func_1_2_2 {    public static void main(String []args) {        int i = 256;        while (i-- != 0) {            /*            for i in 16:                for j in 16:                    if i%4 == j%4:                        continue                    print(i,j)             */            if(i/16%4 == i%16%4)                continue;            System.out.println("A = " + i/16 + " B = " + i%16);        }    }}