• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 4495
  • Last Modified:

Magic Square C#

I am writing a Magic Square program that finds all the possible combinations of 1 to 9.  I wrote the recursive part of it but it seems to just be going on forever.  I want to print out all the possible ways of 1 to 9 without any repetitions.  Is this right?
using System;

namespace ConsoleApplication4
{
      class Class1
      {
            [STAThread]
            static void Main(string[] args)
            {
                  int n=1;
                  Magic(n);
            }

            public static void Magic(int n)
            {
                  int[] A = new int[10];
                  int[] B = new int[10];

                  for(int i = 1; i <= 9; i++)
                  {
                        if(B[i] == 0) // if i is free
                        {
                              B[i]=1;
                              A[n]=i;

                              if(n<9)
                              {
                                    Magic(n+1);//recurse
                              }
                              else
                              {
                                    TestMagic();//at the end
                              }

                              B[i]=0;
                        }
                        Console.Write(A[n]);
                  }
            }

            public static void TestMagic()
            {

            }
      }
}
0
jmkotman
Asked:
jmkotman
1 Solution
 
muzzy2003Commented:
No, this code gets in an infinite loop. Try something like this:

namespace ConsoleApplication
{
    class Class1
    {
        static int[] A = new int[9];

        [STAThread]
        static void Main(string[] args)
        {
            for (int i = 0; i < 9; i++)
            {
                Array.Clear(A, 0, 9);
                A[0] = i + 1;
                Magic(1);
            }
        }

        public static void Magic(int n)
        {
            for (int i = 0; i < 9; i++)
            {
                bool newNumber = true;
                for (int j = 0; j < n; j++)
                {
                    if (A[j] == i + 1)
                    {
                        newNumber = false;
                        break;
                    }
                }
                if (newNumber)
                {
                    A[n] = i + 1;
                    if (n == 8)
                        Print();
                    else
                        Magic(n + 1);
                }
            }
        }
       
        private static void Print()
        {
            Console.WriteLine("{0}{1}{2}{3}{4}{5}{6}{7}{8}", A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[8]);
        }
    }
}
0
 
_iskywalker_Commented:
you could do what muzzy2003;
or just exchange this part:
          public static void Magic(int n)
          {
         static      int[] A = new int[10];
          static     int[] B = new int[10];

               for(int i = n; i <= 9; i++)
               {

The problem is that the static makes the number remember they were already used, and the i=n makes the n has a better validity, it will
stop as soon as n=9, and will not go depper and depper, even if n is bigger then 9.
I didnt understand why you set again B[i]=0; it will then go forever.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now