Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме 15-35 тыс рублей в месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.12.2017, 23:09   #1
art1es23
 
Регистрация: 04.11.2015
Сообщений: 9
По умолчанию Где ошибка? Игра судоку 8х8

Не могу понять почему есть одинаковые значения, подскажите где ошибка?

Код:
#include <iostream>
#include <ctime>
#include <string>
#include <fstream>
#include <Windows.h>
 
const int A = 8;
const int B = A * A;
 
using namespace std;
 
class Sudoku {
private:
    int mass[A][A], checker[B], stov, lin;
public:
    void Input() {
        int a = 0;
 
        ifstream file_input("Input.txt");
 
        if (file_input.is_open()) {
            
            while (!file_input.eof()) {
                file_input >> stov;
 
                file_input >> lin;
                file_input >> mass[lin][stov];
 
                checker[a] = lin;
                checker[a + 1] = stov;
 
                a += 2;
            }
 
            file_input.close();
            cout << endl << "Зчитування з файлу..." << endl;
        }
        else {
            cout << "\nПомилка зчитування, файл не найдений!\n";
 
            cin.get();
            exit(EXIT_FAILURE);
        }
    }
 
    void Do() {
        for (int a = 0; a < A; a++) {
            for (int b = 0; b < A; b++) {
                if (mass[a][b] < 0) {
                    mass[a][b] = 1;
                }
                for (int c = 0; c < B; c += 2) {
                    if (!(a == checker[c] && b == checker[c+1]))
                        Obrah(a, b);
                }
            }
        }
 
    }
 
    void Obrah(int a, int b) {
        for (int trying = 0; trying < B; trying++) {
            for (int c = 0; c < A; c++) {
                if ((mass[a][b] == mass[a][c] && c != b) || (mass[a][b] == mass[c][b] && c != a))
                    mass[a][b] += 1;
                if (mass[a][b] > 8) {
                    mass[a][b] = 1;
                    c = 0;
                }
            }
        }
    }
 
    void Output() {
        ofstream txt("Result.txt");
 
        cout << "\nВиведення судоку:\n\n";
        txt << "\nВиведення судоку:\n\n";
 
        for (int a = 0; a < A; a++) {
            for (int b = 0; b < A; b++) {
                cout << "\t" << mass[a][b];
                txt << "\t" << mass[a][b];
            }
            cout << "\n\n";
            txt << "\n\n";
        }
        txt.close();
        cout << "\nВирішений судоку записаний у файл";
    }
};
 
class Time {
private:
    int time_begin, time_end, time;
public:
    Time() {};
 
    void Start() {
        time_begin = clock();
    }
 
    void End() {
        time_end = clock();
        time = time_end - time_begin;
 
        cout << endl << endl << "Час обчислень програми: " << time << " млс." << endl;
    }
 
    ~Time() {};
};
 
int main() {
    system("color f0");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    srand(time(NULL));
 
    Sudoku sud;
    Time ti;
 
    sud.Input();
    ti.Start();
 
    sud.Do();
 
    sud.Output();
    ti.End();
 
    cin.get();
    return 0;
}
Изображения
Тип файла: png 333.png (20.1 Кб, 136 просмотров)
art1es23 вне форума Ответить с цитированием
Старый 22.12.2017, 10:48   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,211
По умолчанию

Странно... Разве бывает судоку 8*8 ? 9*9 - да, есть. И каковы же должны быть правила этого 8*8 ?
https://ru.wikipedia.org/wiki/%D0%A1...BE%D0%BA%D1%83
Только тот, кто "изобрел" этот вариант, должен, видимо, знать и правила, и решение. Речь идет о генерации задачи - или решении заданной ?

Последний раз редактировалось digitalis; 22.12.2017 в 10:51.
digitalis вне форума Ответить с цитированием
Старый 22.12.2017, 19:17   #3
art1es23
 
Регистрация: 04.11.2015
Сообщений: 9
По умолчанию

Ну придумал, это не я, к сожалению, но вот условие: В каждом из восьми сегментов паутины заполните свободные ячейки разными числами от 1 до 8, так, чтобы каждое кольцо также содержало разные числа от 1 до 8.
Изображения
Тип файла: jpg zzz.jpg (15.4 Кб, 137 просмотров)
art1es23 вне форума Ответить с цитированием
Старый 22.12.2017, 20:19   #4
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,211
По умолчанию

О, никогда такого не видел ! Помочь, к сожалению, не могу - на С++ не писа'л совсем. Когда-то на Дельфи взялся для "нормального" Судоку, потом бросил. Если случайным образом генерировать, проверяя каждый раз допустимость, то сначала пойдет легко, а в конце будет ооочень много отбраковок. Вариант : заполнить регулярным содержимым - а потом перетасовывать, опять же с проверкой ? ХЗ
Sorry, что не смог помочь.
А вообще задача проще, чем 9*9 - та трехмерная, а эта двухмерная.

Последний раз редактировалось digitalis; 22.12.2017 в 21:48.
digitalis вне форума Ответить с цитированием
Старый 22.12.2017, 22:32   #5
vaDS
Пользователь
 
Регистрация: 16.04.2017
Сообщений: 94
По умолчанию

В этой паутинке, что на картинке, нужно поочередно проверять числа в восьми секторах и те что на находятся на одной окружности.
Недостающие заполнять.
Насчет судоку 9х9 я себе на C# написал "решатор", только он тупит для уровня сложности 5 (там помогать нужно, доставлять цыфры, которые сам можешь определить).
vaDS вне форума Ответить с цитированием
Старый 23.12.2017, 12:07   #6
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,211
По умолчанию

А, так это решение, а не генерация задачи ? Тогда, наверно, проще - возможно американским Brute force - полным перебором с отсечением ненужных вариантов.
Я свое судоку 9х9 тоже написал на Дельфи, тоже не полный автомат, а с интерактивом, с 3 уровнями отката из тупиковых ветвей. Полный автомат, наверно, и не нужен, тогда человек превращается в "подносчика снарядов", тупо заполняющего исходную табличку. Хотя и этот процесс можно автоматизировать, написав простенький Fine Reader. Но тогда решение судоку превращается в рекордный по бессмысленности процесс: положил на сканер листок с задачей, нажал кнопочку - распринтал решение. Впрочем, это лирика.
digitalis вне форума Ответить с цитированием
Старый 24.12.2017, 23:55   #7
art1es23
 
Регистрация: 04.11.2015
Сообщений: 9
По умолчанию

Ясно, спасибо. Попробую.
art1es23 вне форума Ответить с цитированием
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переделать обычное судоку в судоку чёт-нечёт Dark Illusion Общие вопросы Delphi 0 28.03.2012 20:33
написал программу, где то ошибка, не пойму где... Kelevra91 Общие вопросы C/C++ 5 17.01.2011 16:38
игра что где когда firefling Помощь студентам 1 19.04.2010 20:25
Не могу вписать цифры в клетки (игра судоку) Lees27 Общие вопросы C/C++ 1 18.11.2009 17:28