《编程之美》之读书笔记 1.2中国象棋将帅问题

问题描述:

在一把象棋的残局中,象棋双方的将帅不可以相见,即不可以在中间没有其他棋子的情况下在同一列出现。而将、帅各被限制在己方的3*3的格子中运动。用A、B代表将和帅,请写出一个程序,输出A、B所有合法的位置。要求在代码中只能用一个变量。


解法一用了这么多的常量和宏,实在有些麻烦。


解法二方法很赞!!!!

将变量i想象成一个两位九进制的变量。i/9则表示此九进制数的第二位,而i%9则表示此九进制数的个位。

i/9表示A的位置,i%9表示B的位置。两位九进制最大为88,等于十进制的80。

</pre><pre code_snippet_id="417826" snippet_file_name="blog_20140705_2_8296064" name="code" class="cpp">#include <iostream>
using namespace std;

#define BYTE unsigned char

int main()
{
	BYTE i=81;
	while(i--)
	{
		if(i/9%3!=i%9%3)
				 cout<<"A="<<i/9+1<<" B="<<i%9+1<<endl;
		 }
	return 0;
}



解法三用的是C语言中的位段的思路,虽然对于位段的知识有点忘记了,但是翻了翻谭浩强的《C程序设计》之后还是觉得比较好理解。

#include <iostream>
using namespace std;

int main()
{
	 struct packed_data
	 {
		 unsigned char a:4;
		 unsigned char b:4;
	 }i;

	 for(i.a = 1;i.a<=9;i.a++)
		 for(i.b = 1;i.b<=9;i.b++)
		 {
			 if(i.a%3!=i.b%3)
				 cout<<"A="<<i.a<<" B="<<i.b<<endl;
		 }
	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值