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