一个值表示将帅合理位置问题

刚看到这个问题的时候,我不知道将帅合理位置是哪些,没玩过象棋,对围棋的理解也只停留在只要把对方围起来就好了。所以我需要去学习学习。

知道了合理位置之后,我的想法是,那不就是用一个int型的整数表示吗,1-9表示九个位置,这么简单。额,这种想法的不足是要用两个值,一个保存将的位置,一个保存帅的位置。而不是一个值,可以说是审题不清吧。

(那应该也可以用一个两位数的Int值表示吧,十位上表示将的位置,个位上表示帅的位置。应该也是可行的吧,实践了一下,确实可行,只用了一个变量,算是第四种方法:

public static void main(String[] args) {
		int a = 11;
		while(a<100) {
			if((a%10!=0)&&(a/10%3!=a%10%3)) {
				System.out.println(a/10+" "+a%10);
			}
			a++;
		}

	}

正确的做法是,用二进制表示,9个位置需要4位,两个9个位置需要8位。为什么不是18个位置需要5位呢?2^5=32呢!因为5不能被平分?

不是的,是因为它存储的不仅仅是位置,而是合理的位置,是双方棋子的一种状态,黑方有9种状态,红方在黑方的每种状态下也有9种状态,这个状态的关系不是相加,而是相乘的关系,所以两方的将帅位置状态共81种情况,32不能表示81种情况。

那为什么不能用2^7=128的7位表示呢,可能因为7不能被平分吧。虽然7不能被平分,但是应该可以找到一种方法让81中状态和7位二进制表示的数一一对应起来,只是这样这个数表示哪种状态需要对应一张表格了,而且不利于比较双方是否处于同一条线上。

综上,用8位表示是很直观而且利于操作的。

知道了利用一个8位2进制的数来存储就好办了。前四位表示黑方,后四位表示红方,0001 0011表示黑方在1位置,红方在3位置。当两个位置%3的结果相等,表示不合法,具体的操作可以参考:

https://blog.csdn.net/qq_36767247/article/details/80628357

这篇博文,里面有三种方法。

总结就是当遇到说用一个值怎么怎么样的时候,不要老是想整数,第一反应应该是二进制,毕竟省空间,而且8位16位32位64位都可以是一个数呢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值