Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный платный хостинг на базе Windows 2008

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

lamed
Статус: Практикант
Рейтинг: 2105
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 1742
∙ повысить рейтинг »
_Ayl_
Статус: Студент
Рейтинг: 1578
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Программирование / C/C++

Номер выпуска:1484
Дата выхода:05.02.2010, 18:00
Администратор рассылки:Dr_Andrew, Старший модератор
Подписчиков / экспертов:636 / 185
Вопросов / ответов:1 / 1
IRC-канал по теме:#C

Вопрос № 176388: Здравствуйте, эксперты. Я написал простенькую программу, которая генерирует судоку. Однако в некоторых (прибл. 1 из 10) случаях программа выполняется "зависает" - вовлечена в бесконечный цикл. Прошу проверить код, и исправить ...



Вопрос № 176388:

Здравствуйте, эксперты.

Я написал простенькую программу, которая генерирует судоку. Однако в некоторых (прибл. 1 из 10) случаях программа выполняется "зависает" - вовлечена в бесконечный цикл.

Прошу проверить код, и исправить программу.

Код:
#include <iostream>
#include <cstdlib>
using namespace std;

const int SIZE = 9;
int sudoku[SIZE][SIZE];
int test_array[SIZE*SIZE][SIZE] = {0};

bool checkrow(int, int);
bool checkcol(int, int);
bool checksqr(int, int);
bool test(int, int);
void moveback(int& i, int& j);
void write(int i, int j);
void print();

int main()
{
srand(rand() ^ time(0));

int i, j;
for(i=0; i<9; i++)
{
for(j=0; j<9; j++)
{
for(;;)
{
if(!test(i, j))
moveback(i, j);

sudoku[i][j] = rand()%9+1;
write(i, j);

if(checksqr(i, j) && checkrow(i, j) && checkcol(i, j) )
break;
}
}
}

print();

return 0;

}

bool checkrow(int x, int y)
{
for(int i=0; i<y; i++)
if(sudoku[x][i] == sudoku[x][y])
return false;

return true;
}

bool checkcol(int x, int y)
{
for(int i=0; i<x; i++)
if(sudoku[i][y] == sudoku[x][y])
return false;

return true;
}

bool checksqr(int x, int y)
{
int i_start = x/3; i_start *= 3;
int j_start = y/3; j_start *= 3;

for(int i=i_start; i < i_start+3; i++)
for(int j=j_start; j < j_start+3; j++)
{
if(i==x && j==y)
return true;

if(sudoku[i][j] == sudoku[x][y])
return false;
}
return true;
}

bool test(int i, int j)
{
int current = i*9 +j+1;

for(int x=1; x<9; x++)
if( test_array[current][x] == 0)
return true;

return false;
}

void moveback(int& i, int& j)
{
int current = i*9 +j+1;

for(int x=0; x<9; x++)
test_array[current][x] = 0;

if(j < 1)
{
i--; j=8;
}
else
j--;
}

void write(int i, int j)
{
int current = i*9 + j+1;
int value = sudoku[i][j];
test_array[current][value] = 1;
}

void print()
{
int i, j;

for(i=0; i<9; i++)
{
if( i%3 == 0 )
cout << "=========================\n";

cout << "| ";

for(j=0; j<9; j++)
{
cout << sudoku[i][j] << " ";

if((j+1)%3 == 0)
cout << "| ";
}

cout << endl;< br> }
cout << "=========================\n";
}

Отправлен: 30.01.2010, 17:31
Вопрос задал: Иванов Андрей Владимирович, 5-й класс
Всего ответов: 1
Страница вопроса »


Отвечает Dr_Andrew, Старший модератор :
Здравствуйте, Иванов Андрей Владимирович.
Ответ на основе комментария в мини-форуме эксперта amnick.

Программа для генерации судоку в приложении.

Приложение:

Ответ отправил: Dr_Andrew, Старший модератор
Ответ отправлен: 04.02.2010, 07:01
Номер ответа: 259196
Казахстан, Алма-Ата
Организация: Казахский научный центр карантинных и зоонозных инфекций
Адрес сайта: Медицинские программы для Linux
ICQ # 256452186

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 259196 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:

  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.14 от 03.02.2010

    В избранное