Генератор сетки судоку

Я только начал делать свою игру Судоку, и я сделал эту функцию grid для создания сетки 6x6 Судоку. Я использовал функцию rand() для разных чисел в каждой ячейке (в настоящее время она будет проверять строки только на повторение чисел). rand() также используется для случайного количества пустых ячеек в каждой сетке.

Проблема в том, что иногда сетка идеальна 6x6 и без повторения чисел (только в строках), однако иногда в некоторых ячейках генерируются мусорные значения, а иногда количество столбцов увеличивается. Я не понимаю, в чем причина проблемы?

Код:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void grid(void) {
    int cell[6][6], row, col, s, i, j;
    char in = 'A';
    srand(time(NULL));
    for (row = 0; row <= 5; row++) {
        printf("\t\t\t[ |");
        for (col = 0; col <= 5; col++) {
            s = rand() % 6 + 1;
            if (s % 2 == 0)
            {
                cell[row][col] = rand() % 6 + 1;
                for (j = 0; j<col; j++) {
                    if (cell[row][j] == cell[row][col]) {
                        col--;
                        continue;
                    }
                }
            }
            else { printf("   | ", in++); continue; }
            printf(" %d | ", cell[row][col]);
        }
        printf("]\n\n");
    }
}

int main()
{
    grid();
}

person MGB    schedule 22.02.2017    source источник
comment
Используемый вами стиль отступа Pico может подойти для Pico, но C — это не Pico. Пожалуйста, используйте ортодоксальный C стиль отступа — я предпочитаю Allman, но многие люди предпочитают какой-то вариант 1TBS. Придерживайтесь одного или другого из них, и вы не ошибетесь.   -  person Jonathan Leffler    schedule 22.02.2017
comment
На доске судоку 6x6 у вас обычно есть 6 подячеек по 2 строки и 3 столбца, и вы должны сохранить уникальность 6 чисел в каждой подячейке, а также в каждой строке и каждом столбце. Ваш код, кажется, не делает достаточно, чтобы соответствовать этим критериям. На доске 9x9 у вас будет 9 подячеек, каждая размером 3x3, с уникальными числами в каждой подячейке, а также в каждой строке и столбце. Интересно, не лучше ли будет случайным образом переставить массив из 6 элементов? (Я не кодировал генератор судоку, я не знаю, как это сделать лучше всего. Но на SO есть почти 700 вопросов с тегами судоку!)   -  person Jonathan Leffler    schedule 22.02.2017


Ответы (2)


Слишком много синтаксических ошибок в коде, который вы публикуете, и формат довольно ужасен. Попробуйте отредактировать его, чтобы мы могли вам помочь!

кол--; Возможно, это ваша проблема, потому что если вы col--; в своем for (col = 0; col < 6; col++) цикле, вы сделаете более 6 итераций.

person Dot31    schedule 22.02.2017
comment
Добро пожаловать в Stack Overflow. Я согласен с тем, что код в вопросе не читается, как написано. Тем не менее, вам, вероятно, лучше подождать, пока у вас будет достаточно репутации (50 баллов), чтобы комментировать, чем добавлять комментарий в качестве «ответа». col-- не является серьезной проблемой; это способ вернуться и еще раз попытаться сгенерировать номер, когда выбранный номер уже используется. Код может быть неправильным в алгоритме, но col-- сам по себе не является проблемой автоматически. - person Jonathan Leffler; 22.02.2017
comment
Как я могу получить 50 репутации, не отвечая? (честный вопрос, не сарказм) и извините за неправильный ответ :/ - person Dot31; 23.02.2017
comment
Есть 3 основных способа завоевать репутацию: (1) задавать хорошие вопросы; (2) давать хорошие ответы; (3) внесение правок в вопросы или ответы, которые считаются правильными. Вы должны найти вопрос, на который вы знаете или можете найти ответ — возможно, вопрос, которым пренебрегали в течение часа или более, поэтому вы не будете конкурировать с толпой FGITW (самая быстрая пушка на западе) — и предоставить хороший ответ на него. Обычно это принесет вам некоторую репутацию. - person Jonathan Leffler; 23.02.2017
comment
Спасибо за ваши советы :) - person Dot31; 25.02.2017

Я знаю, что этот вопрос старый, но комментатор здесь сказал подождать не менее 1 часа...

Чтобы ответить на ваш вопрос напрямую:

  1. Вы получаете бессмысленные значения, потому что не устанавливаете значения для cell, когда !(s % 2 == 0).
  2. Вы получаете более 6 записей в строке, потому что ваш оператор c-- заставляет цикл col выполняться более 6 раз (и каждый раз вы печатаете).

Если вы хотите сохранить общую структуру вашей логики, то делайте это в два прохода — заполняйте cell полностью, а затем печатайте целиком. Однако есть и другие проблемы. Вы, вероятно, захотите полностью удалить проверку s % 2 == 0, а первой continue может быть break (или goto, если вы действительно хотите разозлить людей).

person Ian    schedule 18.01.2021