コード例 #1
0
        public static int Solve()
        {
            // http://hungarianalgorithm.com/examplehungarianalgorithm.php
            // https://brilliant.org/wiki/hungarian-matching/
            string[] lines   = File.ReadAllLines(@"..\..\txt\Problem345Text.txt");
            int[][]  numbers = new int[lines.Length][];
            for (int i = 0; i < lines.Length; i++)
            {
                string[] nums = lines[i].Split(' ');
                numbers[i] = new int[nums.Length];
                for (int j = 0; j < nums.Length; j++)
                {
                    numbers[i][j] = int.Parse(nums[j]);
                }
            }
            a = EulerUtilities.DeepCopy(numbers);
            int max = 0;

            for (int i = 0; i < a.Length; i++)
            {
                for (int j = 0; j < a[i].Length; j++)
                {
                    if (a[i][j] > max)
                    {
                        max = a[i][j];
                    }
                }
            }

            for (int i = 0; i < a.Length; i++)
            {
                for (int j = 0; j < a[i].Length; j++)
                {
                    a[i][j] = max - a[i][j];
                }
            }
            int[] assignments = MinAssignmentCost();
            int   sum         = 0;

            for (int i = 0; i < numbers.Length; i++)
            {
                sum += numbers[i][assignments[i]];
            }
            return(sum);
        }
コード例 #2
0
 public static int[][] SudokuSolveRecur(int[][] solved, string[][] viableNumbers)
 {
     while (ContainsBlank(solved))
     {
         int row, column, viables;
         FindMinimumViable(solved, viableNumbers).Deconstruct(out row, out column, out viables);
         if (viables == 1)
         {
             solved[row][column]        = int.Parse(viableNumbers[row][column]);
             viableNumbers[row][column] = null;
             RemoveViables(solved, viableNumbers, row, column);
         }
         else if (viables > 1)
         {
             foreach (char num in viableNumbers[row][column])
             {
                 int[][]    solvedTemp  = EulerUtilities.DeepCopy(solved);
                 string[][] viablesTemp = EulerUtilities.DeepCopy(viableNumbers);
                 solved[row][column]        = (num - 48);
                 viableNumbers[row][column] = null;
                 RemoveViables(solved, viableNumbers, row, column);
                 solved = SudokuSolve(solved, viableNumbers);
                 if (!ContainsBlank(solved))
                 {
                     return(solved);
                 }
                 else
                 {
                     solved        = solvedTemp;
                     viableNumbers = viablesTemp;
                 }
             }
             return(solved);
         }
         else
         {
             return(solved);
         }
     }
     return(solved);
 }