问题描述:
在一把象棋的残局中,象棋双方的将帅不可以相见,即不可以在中间没有其他棋子的情况下在同一列出现。而将、帅各被限制在己方的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;
}