public static void main(String[] args) {
		try {
			ArrayList<int[]> toSolve;
			if (args == null || args.length == 0 || args[0] == "help"
					|| args[0] == "man" || args[0] == "?") {
				System.out.println("The argument format should be as follow: "
						+ ARG_FORMAT);
				toSolve = new ArrayList<int[]>();
			} else {
				toSolve = SudokuParser.randomBoards(args[0],
						Integer.parseInt(args[1]));
			}

			SudokuBoard sudokuBoard;
			// We use a set of sets in case we want to implement searching for
			// every possible solution, which is a bit longer.
			List<ExactCoverAction> results;

			for (int[] board : toSolve) {
				DancingLinksSearch dancingLinksSearch = new DancingLinksSearch();
				results = new LinkedList<ExactCoverAction>();

				sudokuBoard = new SudokuBoard(board);
				results = dancingLinksSearch.solve(sudokuBoard);

				System.out.println("Metrics: "
						+ dancingLinksSearch.getMetrics());

				if (results.isEmpty())
					System.out.println("No solution found.\n");
				else {
					System.out.print("Actions: ");
					String actionOutputStr = "";
					for (ExactCoverAction action : results) {
						sudokuBoard.changeState(action);
						actionOutputStr += (action + ", ");
					}
					System.out.println(actionOutputStr.substring(0,
							actionOutputStr.length() - 2));
					System.out.print(sudokuBoard);
				}
			}
		} catch (Exception e) {
			System.out.println("Use the following argument format: "
					+ ARG_FORMAT);
			e.printStackTrace();
		}
	}