int i_from, j_from;
for(i=0; i<size; i++)
{
for(j=0; j<size; j++)
{
if(i<3) i_from=0;
else if(i<6) i_from=3;
else i_from=6;
if(j<3) j_from=0;
else if(j<6) j_from=3;
else j_from=6;
for(;;)
{
repeated=false;
number=rand()%9+1;
for(l=i_from; l<i; l++)
for(k=j_from; k<j; k++)
if(sudoku[l][k]==number)
{
repeated=true;
break;
}
...
}
#include <time.h>
#include <iostream>
#include <stdlib.h>
using namespace std;
const int size = 9;
const int initial_mask = ~((-1) << size);
int sudoku[size][size]; // это матрица судоку
// этот массив будет использоваться для пометки проверенных чисел
// лишняя колонка позволяет избежать дополнительной проверки индекса
int check[size][size+1];
// генерируем ячейку
bool cell( int i, int j )
{
int chk = check[i][j]; // маска чисел, уже проверенных в этой ячейке
if( !chk )
return false; // на предыдущих проходах уже были проверены все числа
for(;;)
{
// генерируем число, новое для этой ячейки
int number, bit;
do {
number = rand() % size;
bit = 1 << number;
} while( !(chk & bit) );
chk &= ~bit;
++number;
// проверяем, было ли это число ранее ...
bool repeated = false;
// ... в столбце
for(int l=0; l<i; l++)
if(sudoku[l][j]==number)
{
repeated = true;
break;
}
if( repeated ) {
// number уже есть в этом стобце
if( chk == 0 ) return false; // проверены все числа
continue; // пытаемся снова
}
// ... в строке
for(int k=0; k<j; k++)
if(sudoku[i][k]==number)
{
repeated = true;
break;
}
if( repeated ) {
// number уже есть в этой строке
if( chk == 0 ) return false; // проверены все числа
continue; // пытаемся снова
}
sudoku[i][j] = number; // нашли подходящее (пока) число
check[i][j] = chk; // сохраняем маску проверенных чисел
cout << number << " ";
return true;
}
}
// генерируем строку
bool row( int i )
{
check[i][0] = initial_mask; // сброс маски для первой ячейки
int j = 0;
while( j < size ) {
if( cell( i, j )) {
// ячейка заполнена, переходим к следующей
++j;
check[i][j] = initial_mask; // сброс маски для очередной ячейки
// индекс j здесь не проверяли - помните объявление int check[size][size+1] ?
}
else {
// увы, не получилось
// возвращаемся к предыдущей ячейке и ищем для нее какое-то другое число
// будет использована ранее сохраненная маска check[][]
if( --j < 0 )
return false; // придется вернуться к предыдущей строке
// вывод отладочной информации - отслеживание возвратов
cout << endl << i << ": ";
for( int k = 0; k < j; ++k )
cout << sudoku[i][k] << " ";
}
}
cout << endl;
return true;
}
int main()
{
time_t kl;
time( &kl );
srand(kl);
int i = 0;
while( i < size ) {
cout << i << ": ";
if( row( i ))
++i;
else
if( --i < 0 ) { cout << endl << "error! << endl"; break; }
}
int j;
cout << endl;
for(i=0; i<size; i++)
{
for(j=0; j<9; j++)
cout << sudoku[i][j] << " ";
cout << endl;
}
}
if(i<3) i_from=0;
else if(i<6) i_from=3;
else i_from=6;
if(j<3) j_from=0;
else if(j<6) j_from=3;
else j_from=6;
j_from= j - ( j % 3 );
i_from= i - ( i % 3 );
// ... в строке
for(int k=0; k<size; k++)
{
ii=k % 3;//остаток от деления
jj=k / 3;//деление нацело
if(sudoku[i_form+ii][j_form+jj]==number)
{
repeated = true;
break;
}
}
0: 9 5 7 2 1 4 6 8 3
1: 1 2 4 7 5 8 9
1: 1 2 4 7 5 8
1: 1 2 4 7 5 3 9
1: 1 2 4 7 5 3
1: 1 2 4 7 5 6 9
1: 1 2 4 7 5 6
1: 1 2 4 7 5 9
1: 1 2 4 7 5
1: 1 2 4 7 9 3 5
1: 1 2 4 7 9 3
1: 1 2 4 7 9 6 5
1: 1 2 4 7 9 6
1: 1 2 4 7 9 8 5
1: 1 2 4 7 9 8
1: 1 2 4 7 9 5
1: 1 2 4 7 9
1: 1 2 4 7 3 6 9 5
1: 1 2 4 7 3 6 9
1: 1 2 4 7 3 6 5 9
1: 1 2 4 7 3 6 5
1: 1 2 4 7 3 6
1: 1 2 4 7 3 8 9 5
1: 1 2 4 7 3 8 9
1: 1 2 4 7 3 8 5 9
1: 1 2 4 7 3 8 5
1: 1 2 4 7 3 8
1: 1 2 4 7 3 5 9
1: 1 2 4 7 3 5
1: 1 2 4 7 3 9 5
1: 1 2 4 7 3 9
1: 1 2 4 7 3
1: 1 2 4 7 8 3 9 5
1: 1 2 4 7 8 3 9
1: 1 2 4 7 8 3 5 9
1: 1 2 4 7 8 3 5
1: 1 2 4 7 8 3
1: 1 2 4 7 8 9 5
1: 1 2 4 7 8 9
1: 1 2 4 7 8 6 5 9
1: 1 2 4 7 8 6 5
1: 1 2 4 7 8 6 9 5
1: 1 2 4 7 8 6 9
1: 1 2 4 7 8 6
1: 1 2 4 7 8 5 9
1: 1 2 4 7 8 5
1: 1 2 4 7 8
1: 1 2 4 7 6 8 9 5
1: 1 2 4 7 6 8 9
1: 1 2 4 7 6 8 5 9
1: 1 2 4 7 6 8 5
1: 1 2 4 7 6 8
1: 1 2 4 7 6 3 9 5
1: 1 2 4 7 6 3 9
1: 1 2 4 7 6 3 5 9
1: 1 2 4 7 6 3 5
1: 1 2 4 7 6 3
1: 1 2 4 7 6 9 5
1: 1 2 4 7 6 9
1: 1 2 4 7 6 5 9
1: 1 2 4 7 6 5
1: 1 2 4 7 6
1: 1 2 4 7
1: 1 2 4 3 5 6 7 9
1: 1 2 4 3 5 6 7
1: 1 2 4 3 5 6 9 7
1: 1 2 4 3 5 6 9
1: 1 2 4 3 5 6
1: 1 2 4 3 5 7 9
1: 1 2 4 3 5 7
1: 1 2 4 3 5 9 7
1: 1 2 4 3 5 9
1: 1 2 4 3 5 8 9 7
1: 1 2 4 3 5 8 9
1: 1 2 4 3 5 8 7 9
1: 1 2 4 3 5 8 7
1: 1 2 4 3 5 8
1: 1 2 4 3 5
1: 1 2 4 3 9 7 5
1: 1 2 4 3 9 7
1: 1 2 4 3 9 5 7
1: 1 2 4 3 9 5
1: 1 2 4 3 9 8 5 7
1: 1 2 4 3 9 8 5
1: 1 2 4 3 9 8 7 5
1: 1 2 4 3 9 8 7
1: 1 2 4 3 9 8
1: 1 2 4 3 9 6 7 5
1: 1 2 4 3 9 6 7
1: 1 2 4 3 9 6 5 7
1: 1 2 4 3 9 6 5
1: 1 2 4 3 9 6
1: 1 2 4 3 9
1: 1 2 4 3 7 8 9 5
1: 1 2 4 3 7 8 9
1: 1 2 4 3 7 8 5 9
1: 1 2 4 3 7 8 5
1: 1 2 4 3 7 8
1: 1 2 4 3 7 5 9
1: 1 2 4 3 7 5
1: 1 2 4 3 7 9 5
1: 1 2 4 3 7 9
1: 1 2 4 3 7 6 5 9
1: 1 2 4 3 7 6 5
1: 1 2 4 3 7 6 9 5
1: 1 2 4 3 7 6 9
1: 1 2 4 3 7 6
1: 1 2 4 3 7
1: 1 2 4 3 8 7 9 5
1: 1 2 4 3 8 7 9
1: 1 2 4 3 8 7 5 9
1: 1 2 4 3 8 7 5
1: 1 2 4 3 8 7
1: 1 2 4 3 8 5 9 7
1: 1 2 4 3 8 5 9
1: 1 2 4 3 8 5 7 9
1: 1 2 4 3 8 5 7
1: 1 2 4 3 8 5
1: 1 2 4 3 8 9 5 7
1: 1 2 4 3 8 9 5
1: 1 2 4 3 8 9 7 5
1: 1 2 4 3 8 9 7
1: 1 2 4 3 8 9
1: 1 2 4 3 8 6 5 7 9
2: 3 6 8 9 7 5 4 1 2
3: 4 8 9 5 6 2 3
3: 4 8 9 5 6 2 1 3 7
4: 6 1 3 4 9 8 2 5
4: 6 1 3 4 9 8 2
4: 6 1 3 4 9 8
4: 6 1 3 4 9 7 8 5
4: 6 1 3 4 9 7 8 2 5
5: 2 7 5 1 3 8 9 4 6
6: 7 3 2 8 5 1
6: 7 3 2 8 5 9
6: 7 3 2 8 5
6: 7 3 2 8 4 1
6: 7 3 2 8 4 9
6: 7 3 2 8 4
6: 7 3 2 8
6: 7 3 2 6 4 1
6: 7 3 2 6 4 9
6: 7 3 2 6 4
6: 7 3 2 6 5 9
6: 7 3 2 6 5 1
6: 7 3 2 6 5
6: 7 3 2 6
6: 7 3 2
6: 7 3 6 8 4 9 2 5 1
7: 8 4 1 7 2 3
7: 8 4 1 7 2
7: 8 4 1 7 5 3
7: 8 4 1 7 5
7: 8 4 1 7
7: 8 4 1 6 2 3 7 9
7: 8 4 1 6 2 3 7
7: 8 4 1 6 2 3
7: 8 4 1 6 2
7: 8 4 1 6 5 3 7 9
7: 8 4 1 6 5 3 7
7: 8 4 1 6 5 3
7: 8 4 1 6 5
7: 8 4 1 6
7: 8 4 1
7: 8 4 2 6 5 1 7 9
7: 8 4 2 6 5 1 7
7: 8 4 2 6 5 1 3 9
7: 8 4 2 6 5 1 3
7: 8 4 2 6 5 1
7: 8 4 2 6 5 3 7 9
7: 8 4 2 6 5 3 7
7: 8 4 2 6 5 3
7: 8 4 2 6 5
7: 8 4 2 6
7: 8 4 2 7 5 3
7: 8 4 2 7 5 1 3 6
7: 8 4 2 7 5 1 3 9
7: 8 4 2 7 5 1 3
7: 8 4 2 7 5 1
7: 8 4 2 7 5
7: 8 4 2 7
7: 8 4 2
7: 8 4
7: 8 9 2 7 5 1 3 6 4
8: 5 4 1 6 2 3 7 9 8
Matrix:
9 5 7 | 2 1 4 | 6 8 3
1 2 4 | 3 8 6 | 5 7 9
3 6 8 | 9 7 5 | 4 1 2
------+-------+-------
4 8 9 | 5 6 2 | 1 3 7
6 1 3 | 4 9 7 | 8 2 5
2 7 5 | 1 3 8 | 9 4 6
------+-------+-------
7 3 6 | 8 4 9 | 2 5 1
8 9 2 | 7 5 1 | 3 6 4
5 4 1 | 6 2 3 | 7 9 8
**********************
0: 4 1 5 9 6 7 8 3 2
1: 6 3 8 2 5 4 9 1 7
2: 9 7 2 3 1 8 5 4 6
3: 2 4 7 1 9 6 3 5 8
4: 3 9 6 5 7 2 1
4: 3 9 6 5 7 2 4
4: 3 9 6 5 7 2
4: 3 9 6 5 7
4: 3 9 6 5 8 2 7
4: 3 9 6 5 8 2 1 7 4
5: 1 8
5: 1 5
5: 1
5: 5 8 1 4 7 3 2 9
5: 5 8 1 4 7 3 2 6 9
6: 1 2 9 6 4 5 7 8 3
7: 8 6 3 7 2 9 4
7: 8 6 3 7 2 9
7: 8 6 3 7 2 1 4 9 5
8: 7 5 4 8 3 9 6 2 1
Matrix:
4 1 5 | 9 6 7 | 8 3 2
6 3 8 | 2 5 4 | 9 1 7
9 7 2 | 3 1 8 | 5 4 6
------+-------+-------
2 4 7 | 1 9 6 | 3 5 8
3 9 6 | 5 8 2 | 1 7 4
5 8 1 | 4 7 3 | 2 6 9
------+-------+-------
1 2 9 | 6 4 5 | 7 8 3
8 6 3 | 7 2 1 | 4 9 5
7 5 4 | 8 3 9 | 6 2 1
for(int k=0; k<size; k++)
{
ii=k % 3;//остаток от деления
jj=k / 3;//деление нацело
if(sudoku[i_form+ii][j_form+jj]==number)
.......
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.