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