Форум программистов, компьютерный форум CyberForum.ru

Судоку! - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Что за программа http://www.cyberforum.ru/cpp/thread82592.html
Есть видио уроки по C++, и там используется непонятно какая среда программирования. Подскажите если знаете как эта программа называется. И еще сразу вопрос: какая среда программирования самая удобная и простая в освоении?
C++ Генератор случайных чисел Вот написал программу, которая генерирует матрицу 9*9. В каждой строке - от 1 до 9, не повторяются В каждом стобце - то же самое. Однако программа работет не совсем так, как надо - числа с строках и столбцах повторяются. Подскажите, что неправильно? Вот код: http://www.cyberforum.ru/cpp/thread82548.html
C++ Найти первые m более чем 2-разрядных чисел-палиндромов
Всем привет. Пришёл на Ваш форум с просьбой...может ли тут кто-нить помочь мне в решении задачи?) Найти первые m более чем 2-разрядных чисел-палиндромов, то есть чисел, десятичная запись которых читается одинаково в прямом и обратном направлениях, например: 353, 234432. Если кто нить напишет решение, буду весьма и весьма признателен! Добавлено через 26 минут #include <iostream>...
C++ Инициализация вектора массивом
Можно ли как-то упростить эту запись? int fib={1,1,2}; int tri={1,3,6}; int luc={1,3,4}; int sqr={1,4,5}; int pel={1,2,5}; int pen={1,5,12}; vector<int> fibonacci(fib,fib+3), lucas(luc,luc+3), pell(pel,pel+3), triangular(tri,tri+3), square(sqr,sqr+3), pentagonal(pen,pen+3);
C++ Обработка двумерых массивов и суммирование рядов. http://www.cyberforum.ru/cpp/thread82265.html
Здравствуйте. Помогите написать небольшие программы на visual c++ по обработке массивов. 1)Разработать алгоритм решения задачи суммирования ряда. C помощью цикла с предусловием while. Предусмотреть ввод данных (аргумент и точность) с клавиатуры и вывод результата (сумма ряда) на экран. Сравнить полученное значение суммы с точным значением путем вычисления заданной функции...
C++ Компиляция С++ проекта для КПК Всем привет! Решил тут одну полезную программку скомпилить для покета. У меня стоит VS2003 и когда-то я еще на VB создавал проект Smart Device Application, и он работал. А для С++ не нашел похожего ничего. + еще программка то написана для консоли. Надо ли для КПК будет рисовать формочки? Подскажите пожалуйста куда копать! подробнее

Показать сообщение отдельно
OVERPOWER8
19 / 19 / 1
Регистрация: 29.11.2009
Сообщений: 224
05.01.2010, 22:49  [ТС]     Судоку!
Почти что написал, вот код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#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;
    }
}
Только один недочет - надо, чтобы в квадратах 3*3 тоже были разные значения.

Т. е. надо как-то вот этот код туда прибахать:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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;
                                                }
                        ...
                        }
 
Текущее время: 19:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru