public BoardState Generate(BoardTemplate template) { if (template == null) { throw new ArgumentNullException(nameof(template)); } int[] values = template.GetValues(); List<int> set = GetUnspecifiedValues(values); List<int> unspecifiedIndices = GetUnspecifiedIndices(values); foreach (int unspecifiedIndex in unspecifiedIndices) { int i = this.random.Next(0, set.Count); values[unspecifiedIndex] = set[i]; set.RemoveAt(i); } if (!BoardValidator.IsSolvable(template.Width, template.Height, values)) { int i = unspecifiedIndices[0]; int j = unspecifiedIndices[1]; if (values[i] == 0) { i = unspecifiedIndices[2]; } else if (values[j] == 0) { j = unspecifiedIndices[2]; } int temp = values[i]; values[i] = values[j]; values[j] = temp; } return new BoardState(template.Width, template.Height, values); }