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

这篇博客介绍了如何使用位运算技巧,仅用一个变量来表示象棋棋盘上将、帅的所有合法位置,通过位操作快速枚举并检查位置差条件。

题意:请写出一个程序,输出将、帅所有合法的位置,要求在代码中只使用一个变量

解法一:位运算,9个位置状态可以用4bit位表示,一共需要1byte。左边4bit,代表A的位置,右边4bit,代表B的位置,然后每次都去更新bit位即可。

package com.leetcode.test;

public class Test {
    public static void main(String[] args) {
        /**
         * 1:0001 2:0010 3:0011 4:0100 5:0101 6:0110 7:0111 8:1000 9:1001
         * 左边4bit,代表A的位置,右边4bit,代表B的位置
         * 枚举左半所有的状态 0x10(000010000) - 0x90(10010000),每次加0x10 (A状态:i>>4 B状态 i&0xF)
         *
         *
         16: 0001 0000
         32: 0010 0000
         48: 0011 0000
         64: 0100 0000
         80: 0101 0000
         96: 0110 0000
         112:0111 0000
         128:1000 0000
         *
         */
        for (int i = 0x10; i < 0x90; i += 0x10){
            /**
             * 
             * 枚举A 和 B在棋盘中出现的所有可能位置状态 i
             */
            for (i= (i & 0xF0) | (i >> 4); (++i & 0xF) < 10; ) {
                /**
                 * 将和帅的位置差不能为3 or 6
                 * 
                 */
                if (((i & 0xF) - (i >> 4)) != 3 && ((i & 0xF) - (i >> 4)) != 6)
                {
                    System.out.println(String.format("A= %d , B =%d" , (i>>4),(i&0xF)));
                    System.out.println(String.format("A= %d , B =%d" , (i&0xF),(i>>4)));
                }
            }
        }

    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值