using System.Collections.Generic;
public Board Solve(Board board) {
public static void Main(){
TestPuzzle("/Easy/Puzzle185Easy.sd");
TestPuzzle("/Easy/Puzzle186Easy.sd");
TestPuzzle("/Easy/Puzzle187Easy.sd");
TestPuzzle("/Easy/Puzzle188Easy.sd");
TestPuzzle("/Easy/Puzzle189Easy.sd");
TestPuzzle("/Easy/Puzzle190Easy.sd");
TestPuzzle("/Medium/Puzzle185Medium.sd");
TestPuzzle("/Medium/Puzzle186Medium.sd");
TestPuzzle("/Medium/Puzzle187Medium.sd");
TestPuzzle("/Medium/Puzzle188Medium.sd");
TestPuzzle("/Medium/Puzzle189Medium.sd");
TestPuzzle("/Hard/HardProblem187.sd");
TestPuzzle("/Hard/HardProblem188.sd");
TestPuzzle("/Hard/HardProblem189.sd");
TestPuzzle("/Hard/HardProblem190.sd");
public static void TestPuzzle(string file){
Board board = new Board(new List<List<int>>());
var client = new WebClient();
var str = client.DownloadString("https://raw.githubusercontent.com/Cprice1771/SudokuTester/master/SudokuUnitTest/Input"+file);
Solver solver = new Solver();
board = solver.Solve(board);
Console.WriteLine("Success");
Console.WriteLine("Failed");
public class Board : List<List<int>>
protected bool Equals(Board other)
for (int i = 0; i < 9; i++)
for (int j = 0; j < 9; j++)
if (this[i][j] != other[i][j])
public override int GetHashCode()
for (int i = 0; i < 9; i++)
for (int j = 0; j < 9; j++)
public Board(IEnumerable<List<int>> board): base(board)
public Board(IEnumerable<List<int>> board, string file)
public void Parse(string file)
string[] lines = file.Split(new[]{"\n"},StringSplitOptions.None);
foreach (string line in lines)
for (int i = 0; i < line.Length; i++)
this[Count - 1].Add(Int32.Parse(line.Substring(i, 1)));
if (this[Count - 1].Count == 8)
foreach (List<int> row in this)
internal List<int> GetPossibleSolutions(int row, int col)
List<int> solutions = new List<int>();
for (int num = 1; num < 10; num++)
foreach (int num in GetRowNums(row))
foreach (int num in GetColoumnNums(col))
foreach (int num in GetQuadNums(row, col))
private List<int> GetQuadNums(int row, int col)
int quad = GetQuad(row, col);
List<int> nums = new List<int>();
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
for (int i = 0; i < 3; i++)
for (int j = 3; j < 6; j++)
for (int i = 0; i < 3; i++)
for (int j = 6; j < 9; j++)
for (int i = 3; i < 6; i++)
for (int j = 0; j < 3; j++)
for (int i = 3; i < 6; i++)
for (int j = 3; j < 6; j++)
for (int i = 3; i < 6; i++)
for (int j = 6; j < 9; j++)
for (int i = 6; i < 9; i++)
for (int j = 0; j < 3; j++)
for (int i = 6; i < 9; i++)
for (int j = 3; j < 6; j++)
for (int i = 6; i < 9; i++)
for (int j = 6; j < 9; j++)
throw new FormatException("Invalid Quad Given");
private int GetQuad(int row, int col)
private List<int> GetColoumnNums(int col)
List<int> foundNumbers = new List<int>();
foreach (List<int> row in this)
foundNumbers.Add(row[col]);
private List<int> GetRowNums(int row)
List<int> foundNumbers = new List<int>();
foreach (int num in this[row])
public int GetEmptySpaceCount()
foreach (List<int> row in this)
public override bool Equals(object obj)
if (!(obj is Board)) return false;
Board other = obj as Board;
for (int i = 0; i < 9; i++)
for (int j = 0; j < 9; j++)
if (this[i][j] != other[i][j])
public override string ToString()
for (int i = 0; i < 9; i++)
for (int j = 0; j < 9; j++)
output += this[i][j] + " ";
List<List<int>> cloneList = new List<List<int>>();
for (int i = 0; i < 9; i++)
cloneList.Add(new List<int>());
for (int j = 0; j < 9; j++)
cloneList[i].Add(this[i][j]);
return new Board(cloneList);