【编程之美】中国象棋将帅问题

问题描述:

【编程之美】中国象棋将帅问题_第1张图片

算法:

遍历A的位置

遍历B的位置

判断A、B位置是否满足要求

如果满足则输出

数据结构:

①A和B的位置存放


思路:

【编程之美】中国象棋将帅问题_第2张图片

将可能的位置打上记号

所以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);
                }
            }
        }

参考资料:《编程之美》


你可能感兴趣的:(算法,编程之美,微软)