国际象棋中王后可以纵向,横向,正斜向(45度)反斜向(135度)通行,可以杀死经过格中任一敌子现在给出任意坐标 int i,j;要求打印她的攻击线到控制台
...
int[,] data=new int[8,8];
void Print();//这个算法不需要,不着为讨论点
void QueenFire(int i,int j)//本方法着为讨论点,请给出算法;
{
  //设置根据i,j求出的王后攻击线(一共4条)把它们标记为"1"记入data在通过print();打印出来
}算法越高效越好,越精炼越好.

解决方案 »

  1. class Q8
    {
      int[,] data=new int[8,8];   void QueenFire(int i, int j)  //本方法着为讨论点,请给出算法; 
      { 
        for (int x = 0; x < 8; x++)
        {
          data[i, x] = data[x, i] = 1;   // 纵横向
        }
        //设置根据i,j求出的王后攻击线(一共4条)把它们标记为"1"记入data在通过print();打印出来 
      }
      

  2. class Q8
    {
      int[,] data=new int[8,8];   void QueenFire(int i, int j)                 //本方法着为讨论点,请给出算法; 
      { 
        for (int k = 0; k < 8; k++)
        {
          data[i, k] = data[k, i] = 1;             // 纵横向
        }
        for (int k = 1; k < 8; k++)
        {
          data[(i + k) % 8, (j + k    ) % 8] = 1;  // 正斜向
          data[(i + k) % 8, (j + 8 - k) % 8] = 1;  // 反斜向
        }
      }
      

  3. class Q8
    {
      static int[,] data=new int[8,8];   static void QueenFire(int i, int j)                 //本方法着为讨论点,请给出算法; 
      { 
        for (int k = 0; k < 8; k++)
        {
          data[i, k] = data[k, j] = 1;                             // 纵横向
        }
        for (int k = 1; k < 8; k++)
        {
          if (i + k <  8 && j + k <  8) data[i + k, j + k] = 1;    // 正斜向正向
          if (i - k >= 0 && j - k >= 0) data[i - k, j - k] = 1;    // 正斜向反向
          if (i + k <  8 && j - k >= 0) data[i + k, j - k] = 1;    // 反斜向正向
          if (i - k >= 0 && j + k <  8) data[i - k, j + k] = 1;    // 反斜向反向
        }
      }  static void Print()                                          //这个算法不需要,不着为讨论点
      {
        for (int i = 0; i < 8; i++)
        {
          for (int j = 0; j < 8; j++)
          {
            System.Console.Write(data[i,j] == 0 ? '-' : '*');
          }
          System.Console.WriteLine();
        }
      }
      
      static void Main()
      {
        QueenFire(2,5);
        Print();
      } 
      

  4. 针对3楼,星星朋友(空军)给出的算法,本人做了一些必要附加代码,完全程序如下:    class Q8
        {
            int[,] data = new int[8, 8];
            internal void QueenFire(int i, int j)                 //本方法着为讨论点,请给出算法; 
            {
                for (int k = 0; k < 8; k++)
                {
                    data[i, k] = data[k, i] = 1;             // 纵横向
                }
                for (int k = 1; k < 8; k++)
                {
                    data[(i + k) % 8, (j + k) % 8] = 1;  // 正斜向
                    data[(i + k) % 8, (j + 8 - k) % 8] = 1;  // 反斜向
                }
                this.Print();
            }
            //
            void Print()
            {
                for (int i = 0; i < 8; i++)
                {
                    for (int j = 0; j < 8; j++)
                    {
                        Console.Write(this.data[i,j].ToString()+",");
                    }
                    Console.Write("\r\n");
                }
            }
        }
    经测试发现,结果并未达至预期..
    测试代码:            Q8 q = new Q8();
                q.QueenFire(3, 2);
                Console.WriteLine();
                q.QueenFire(1, 7);
      

  5. 忘记重置数据了,修改一下;
    class Q8
        {
            int[,] data = new int[8, 8];
            internal void QueenFire(int i, int j)                 //本方法着为讨论点,请给出算法; 
            {
                for (int k = 0; k < 8; k++)
                {
                    data[i, k] = data[k, i] = 1;             // 纵横向
                }
                for (int k = 1; k < 8; k++)
                {
                    data[(i + k) % 8, (j + k) % 8] = 1;  // 正斜向
                    data[(i + k) % 8, (j + 8 - k) % 8] = 1;  // 反斜向
                }
                this.Print();
            }
            //
            void Print()
            {
                for (int i = 0; i < 8; i++)
                {
                    for (int j = 0; j < 8; j++)
                    {
                        Console.Write(this.data[i,j].ToString()+",");
                    }
                    Console.Write("\r\n");
                }
            }
            internal void ResetTestData()
            {
                this.data = new int[8, 8];
                Console.WriteLine();
            }
        }
    //测试代码:
                Q8 q = new Q8();
                q.QueenFire(3, 2);
                q.ResetTestData();
                q.QueenFire(1, 7);
      

  6.         static private void QueenFire(int i, int j)
            {
                for (int k = 0; k < 8; k++) queen[i, k] = queen[k, j] = 1;
                int i1 = i, i2 = i, i3 = i, i4 = i, j1 = j, j2 = j, j3 = j, j4 = j;
                while (i1 > 0 && j1 > 0) queen[--i1, --j1] = 1;
                while (i2 > 0 && j2 < 7) queen[--i2, ++j2] = 1;
                while (i3 < 7 && j3 > 0) queen[++i3, --j3] = 1;
                while (i4 < 7 && j4 < 7) queen[++i4, ++j4] = 1;
            }
      

  7. 忘了说了,调用时 QueenFire(3,5) 实际print后因为数组下标的原因会是在屏幕的(4,6)点初始化.
      

  8.         static private void QueenFire(int i, int j)
            {
                for (int m = 0; m < 8; m++) for (int n = 0; n < 8; n++)
                        if ((m == i) || (n == j) || Math.Abs(m - i) == Math.Abs(n - j)) queen[m, n] = 1;
            }        static private void Print()
            {
                 for (i = 0; i < 8; i++)
                {
                    for (j = 0; j < 8; j++)
                        Console.Write(" " + ((queen[i, j] == 1) ? "*" : "."));
                    Console.WriteLine("\r\n");
                }
            }
      

类似问题 »