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