问题描述:
算法:
遍历A的位置
遍历B的位置
判断A、B位置是否满足要求
如果满足则输出
数据结构:
①A和B的位置存放
思路:
将可能的位置打上记号
所以A、B的位置可以用整数类型存放。
且范围是1~9.
题目要求仅使用一个变量。
方法一:
<span style="white-space:pre"> </span>static void Play1()
{
//4位二进制可以表示0~15。所以可以把一个byte拆分成前后四位。
//比如 b=0010 0001 ,表示A在2(0010)位置,B在1(0001)位置。
byte b = Convert.ToByte("00010001", 2);
//(b & 1111 0000)>>4 = (b & 240)>>4 = A的位置
//b + 0001 0000 = b + 16 = A的位置++
//b & 0000 1111 = b & 15 = B的位置
//b + 0000 0001 = b + 1 = B的位置++
//(b & 1111 0000)+1 = 设置B的位置为1
Console.WriteLine("所有的可能为:");
for (; ((b & 240) >> 4) <= 9; b += 16)
{
for (b = (byte)((b & 240) + 1); (b & 15) <= 9; b += 1)
{
//将帅不能在一条线上,所以取模之后不能相等
if (((b & 240) >> 4) % 3 != (b & 15) % 3)
{
Console.WriteLine("A={0}, B={1}", (b & 240) >> 4, b & 15);
}
}
}
}
方法二:
<span style="white-space:pre"> </span>static void Play2()
{
byte i = 81;
//一个数可以表示为 i = 9*A + B (0≤B≤8),这种形式
//当i = 81, i = 9*9 + 0 。A=9,B=0
//当i = 80, i = 9*8 + 8 。A=8,B=8
//当i = 79, i = 9*8 + 7 。A=8,B=7
//当i = 78, i = 9*8 + 6 。A=8,B=6
//当i = 77, i = 9*8 + 5 。A=8,B=5
//当i = 76, i = 9*8 + 4 。A=8,B=4
//.....
//当i = 1 , i = 9*0 + 1 。A=0,B=1
//所以当i从80开始到1,A从8到0,B一直在0~8之间循环
while (i-- != 0)
{
if(i/9 % 3 != i %9 %3)
{
Console.WriteLine("A={0}, B={1}",i/9+1,i % 9+1);
}
}
}
参考资料:《编程之美》