首页 > 解决方案 > C#中的魔方码单偶数

问题描述

你能帮我为幻方度量创建一个逻辑吗?在给定的示例中,我创建了一个代码,用于为奇数(如 3x3、5x5、7x7 度量)和双偶数(如 4×4、8×8)生成魔方,但无法找到合适的解决方案来创建单个偶数魔方度量如 6x6、10x10 等。

在当前的实现中,任何人都可以在输入中输入一个数字 (n),它将创建一个 nxn 幻方度量。但不能很好地处理单个偶数

class Program
    {
     public  static void Main(string [] args )
        {
           Console.WriteLine("Please enter a number:");
           int n1 = int.Parse(Console.ReadLine());
          // int[,] matrix = new int[n1, n1];
           if (n1 <= 0)
           {
               Negativ();
           }
           else if (n1 == 2)
           {
               Zwei();
           }
           else if ((n1 != 2) && !(n1 < 0) && (n1 % 2 != 0))
           {
                Odd  (n1  );

           }
           else if ((n1 != 2) && !(n1 < 0) && ((n1 - 2) % 4 == 0))
            {//singl Even
                SingleEven(n1);
           }
           else if ((n1 != 2) && !(n1 < 0) && (n1 % 4 == 0))
           {
               DoubleEven (n1);
           }

        }

        private static void  Negativ(){
                Console.WriteLine("Sorry, the number must be positive and greater than 3 ");
                Console.ReadLine();
        }


        public static   void   Zwei(){
                Console.WriteLine("Sorry,there is no magic square of 2x2 and the number must be and greater than 3 ");
                Console.ReadLine();    
        }
public static void Odd (  int n)// odd method
        {

            int[,] magicSquareOdd = new int[n, n];

            int i;
            int j;
            // Initialize position for 1 
            i = n / 2;
            j = n - 1;

            // One by one put all values in magic square 
            for (int num = 1; num <= n * n; )
            {
                if (i == -1 && j == n) //3rd condition 
                {
                    j = n - 2;
                    i = 0;
                }

                else
                {
                    //1st condition helper if next number  
                    // goes to out of square's right side 
                    if (j == n)
                        j = 0;
                    //1st condition helper if next number is  
                    // goes to out of square's upper side 
                    if (i < 0)
                        i = n - 1;
                }
                //2nd condition 

                if (magicSquareOdd[i, j] != 0)
                {
                    j -= 2;
                    i++;
                    continue;
                }

                else
                {
                    //set number 
                    magicSquareOdd[i, j] = num++;
                    //1st condition 
                    j++; i--;
                }
            }
 // print magic square 
                Console.WriteLine("The Magic Square for " + n + " is : ");
                Console.ReadLine();
                for ( i = 0; i < n; i++)
                {

                    for ( j = 0; j < n; j++)
                        Console.Write(" " + magicSquareOdd[i, j] + " ");
                    Console.WriteLine();
                    Console.ReadLine();
                }
                Console.WriteLine(" The sum of each row or column is : " + n * (n * n + 1) / 2 + "");
                Console.ReadLine();

        }
  public static void SingleEven(int n )
            {
              //  int n = magic .Length ;
                int[,] magicSquareSingleEven = new int[n, n];
                int halfN = n / 2;
                int k = (n - 2) / 4;
                int temp;

                int[] swapcol = new int[n];
                int index = 0;

                int[,] minimagic = new int[halfN, halfN];
                *Odd(minimagic) ;* // here is the problem
                for (int i = 0; i < halfN; i++)
                    for (int j = 0; j < halfN; j++)
                    {
                        magicSquareSingleEven[i, j] = minimagic[i, j];
  magicSquareSingleEven[i+ halfN , j+halfN ] = minimagic[i, j]+ halfN *halfN ;
     magicSquareSingleEven[i, j + halfN] = minimagic[i, j] +2* halfN * halfN;
     magicSquareSingleEven[i + halfN, j] = minimagic[i, j] +3* halfN * halfN;
                    }

                for (int i =1; i< k ;i ++)
                    swapcol [index ++]=i ;
                for (int i = n-k+2; i <= n ; i++)
                    swapcol[index++] = i;

                for (int i =1; i<=halfN  ;i ++)
                    for (int j = 1; j<= index ; j ++)
                    {
                        temp = magicSquareSingleEven[i - 1, swapcol[j - 1] - 1];


                        magicSquareSingleEven[i-1,swapcol[j-1]-1]=magicSquareSingleEven[i +halfN-1,swapcol[j-1]-1];

              magicSquareSingleEven[i+halfN-1,swapcol[j-1]-1]=temp;

            }
                        //swaping noses

                         temp=magicSquareSingleEven[k,0]; 

                       magicSquareSingleEven[k,0]=magicSquareSingleEven[k+halfN,0]; 

                        magicSquareSingleEven[k+halfN,0]=temp;



                         temp=magicSquareSingleEven[k+halfN,k]; 

                        magicSquareSingleEven[k+halfN,k]=magicSquareSingleEven[k,k]; 

                       magicSquareSingleEven[k,k]=temp;}

                           //end of swaping
 // print magic square 
                   Console.WriteLine("The Magic Square for " + n + " is : ");
                   Console.ReadLine();
                   for (int i = 0; i < n; i++)
                   {

                       for (int j = 0; j < n; j++)
                           Console.Write(" " + magicSquareSingleEven[i, j] + " ");
                       Console.WriteLine();
                       Console.ReadLine();
                   }
                   Console.WriteLine(" The sum of each row or column is : " + n * (n * n + 1) / 2 + "");
                   Console.ReadLine();

                }

标签: c#magic-square

解决方案


推荐阅读