问题描述:
算法:
遍历A的位置
遍历B的位置
判断A、B位置是否满足要求
如果满足则输出
数据结构:
①A和B的位置存放
思路:
将可能的位置打上记号
所以A、B的位置可以用整数类型存放。
且范围是1~9.
题目要求仅使用一个变量。
方法一:
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); } } } }
方法二:
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); } } }
参考资料:《编程之美》