Я пытаюсь создать функцию для судоку, чтобы проверить, не повторяется ли число от 1 до 9 - PullRequest
0 голосов
/ 06 мая 2019

link

Я пишу для функции для программы, и у меня возникают проблемы с отслеживанием, если я пишу эту функцию правильно, а также реализации компонента проверки полосы, чтобы убедиться,числа внутри тоже не повторяются.

Я пытался сделать 2 для циклов, чтобы пройти через мой массив, чтобы убедиться, что мои строки хотя бы проверены, но должен ли я сделать еще 2 для циклов, чтобы проверить мои строки?Самое главное, как мне реализовать «ценность», я так растерялся.

Мой код должен проверить, содержит ли каждая ячейка число от 1 до 9 (для заполненных ячеек) или 0 (для пробелов).• Ни один номер не повторяется ни в одном ряду.• Ни один номер не повторяется ни в одном столбце.• Ни один номер не повторяется ни в одном поле.Я не хочу слишком усложнять этот проект, так как я начинающий, поэтому, если есть более быстрый способ добиться этого, пожалуйста, дайте мне знать.`

int
is_valid_board(int board[9][9])
{   int n1=0,n2=0,n3=0,n4=0,n5=0,n6=0,n7=0,n8=0,n9=0,n0=0;
    int true;
    int i,j;
    int value;

    for( i = 0; i < 10; i++){

        for (j = 0; j < 10; j++) {
            while (board[i][j] > 9 || board[i][j] < 0) {
                if (board[j][i] == 0) {
                    n0++;
                } else if (board[i][j] == 1) {
                    n1++;
                } else if (board[i][j] == 2) {
                    n2++;
                } else if (board[i][j] == 3) {
                    n3++;
                } else if (board[i][j] == 4) {
                    n4++;
                } else if (board[i][j] == 5) {
                    n5++;
                } else if (board[i][j] == 6) {
                    n6++;
                } else if (board[i][j] == 7) {
                    n7++;
                } else if (board[i][j] == 8) {
                n8++;
            } else if (board[i][j] == 9) {
                n9++;
            } else
                return 1;

           }
       }
        if(n0 != 1)
            return 0;
        if(n1 != 1)
            return 0;
        if(n2 != 1)
            return 0;
        if(n3 != 1)
            return 0;
        if(n4 != 1)
            return 0;
        if(n5 != 1)
            return 0;
        if(n6 != 1)
            return 0;
        if(n7 != 1)
            return 0;
        if(n8 != 1)
            return 0;
        if(n9 != 1)
            return 0;
        }

    }
 `

1 Ответ

0 голосов
/ 06 мая 2019

Я действительно не понимаю, о чем ваш вопрос, но я буду основывать свой ответ на вашем задании. Кроме того, я не понимал, что вы пытаетесь сделать там. Лучше всего, если бы вы объяснили логику своей функции, что она получает в качестве входных данных и каков ее выход.

Я полагаю, что int n0-9 - это переменные, которые подсчитывают, сколько раз появляются каждые цифры - для этого вы просили использовать бит set / clear. для этого бегите по матрице с двойным циклом for, а затем для каждой ячейки, которую вы пересекаете, проверьте, содержит ли его соответствующая строка / столбец это значение.

Я написал кое-что, что могло бы вам помочь. Я не запускал его, чтобы проверить вывод, но для начала попробуй его использовать. Я использовал бит, как вас просили.

первый пример:

int
is_valid_board(int board[9][9])
int i,j;
int value;
int value_bit; //convert row/col value into bit set
int bit_arr_rows[10] = {0}, bit_arr_cols[10] = {0}; //bit array for rows and cols
for(i=0;i<10;i++){
    for(j=0;j<10;j++)
    {
        value = board[i][j];

        //check for valid values
        if(value < 0 || value > 9)
            return 0; 

        //check if the value appear in rows bit array
        value_bit = 1 << i;
        if(bit_arr_rows[value] & value_bit)
            return 0;

        //set the value's bit in the rows bit array.
        bit_arr_rows[value] |= value_bit;

        //check if the value appear in cols bit array
        value_bit = 1 << j;
        if(bit_arr_cols[value] & value_bit)
            return 0;

        //set the value's bit in the cols bit array.
        bit_arr_cols[value] |= value_bit;

    }
}
return 1; //board is valid

Логика: я инициализировал 2-битные массивы, 1 для столбцов и 1 для строк. Каждый битовый массив имеет 10 слотов для каждого значения в диапазоне 0-9. Каждый раз, когда я запускаю новое значение в строке 'i' и столбце 'j', я проверяю, установлен ли i-й бит в массиве битов строк и то же самое в массиве битов столбца для j-го бита. если он не появляется, я устанавливаю бит j'th / i'th в массиве битов col / row.

второй пример (я не думаю, что это именно то, о чем вас просили, но это должно сработать):

int
is_valid_board(int board[9][9])
int i,j,k;
int value;
int check_if_appear; //array of bits that contain the number we want to check if appear.
int number;         // array of bits that contain the number we cross for each number we check.
for(i=0;i<10;i++)
    for(j=0;j<10;j++)
    {
        value = board[i][j];

        //check for valid values
        if(value < 0 || value > 9)
            return 0; 

        //set the value's bit in the bit array.
        check_if_appear = 1; 
        check_if_appear <<= value;

        for(k=0;k<10;k++)
        {
            //check if value appear on corresponding cols
            number = 1 << board[i][k];
            if( number & check_if_appear)
                return 0;

            //check if value appear on corresponding rows
            number = 1 << board[k][j];
            if( number & check_if_appear)
                return 0;
        }           
    }

return 1; //board is valid

логика: Предположим, вы получаете доску (матрица 9x9), бегаете по доске и за каждую клетку установить битовый массив, соответствующий значению значения ячейки. например предположим на board[2][3] == 5 поэтому установите check_if_appear = 3 (2 ^ 5 или b0000000000100000 в двоичном формате). затем бегите по 2-й строке и проверьте, существует ли какое-либо значение. вернуть эту процедуру для 3-х столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...