marikoulam Ответов: 4

Код судоку с 3d-массивом .


Я хочу сделать программу, которая будет случайным образом генерировать доску судоку для игры.( Для тех, кто не знаком с игрой, вам дается игровая доска 9x9 с в основном пустыми местами и некоторыми предварительно заполненными числами.) чтобы завершить ее, вы должны заполнить пустые квадраты так, чтобы в каждой строке, столбце и квадрате 3x3 было 1-9, но только один раз.
программа, которая играет и
решает хорошо известную игру судоку. По сути, программа будет получать данные
для таблицы судоку (с перенаправлением файла из текстового файла) он будет заполнять ее
стол и представить его.
Завершение таблицы основано на правиле игры, что таблица
Судоку 9 х 9 должно включать в себя в каждой строке, в каждом столбце и в
каждый из его 9 внутренних сегментов 3 х 3
Элементы импортируются в программу из текстового файла внутри таблицы
двумерный 9 x 9
каждый открытый (доступный для импорта) слот представлен 0
и каждая закрытая коробка (недоступная для модификации пользователем) с одним
однозначное число от 1 до 9.

Что я уже пробовал:

В настоящее время я представляю себе это как использование 2d-массива. Я использую цикл for внутри цикла for для его заполнения, следя за тем, чтобы число, входящее в квадрат, никогда не было тем, которое уже использовалось в той же строке или столбце.
кроме того, проблема, с которой я сталкиваюсь, заключается в том, как проверить, используется ли это число уже в части сетки 3x3. Я думал об использовании 3d-массива, и третье измерение-это то, где хранятся данные 3x3, но я не знаю простого способа решить, какой массив проверить для текущего квадрата.

Я также не знаю наверняка, будет ли случайная генерация плиток таким образом, как я, всегда производить полную доску. Я беспокоюсь, что он может добраться до одной из последних нескольких плиток и обнаружить, что ни одно число от 1 до 9 не поместится в квадрат, потому что оно уже используется. Я не знаю, как проверить, есть ли такая возможность.
в основном это код с 3d массивом без объекта только с циклами

4 Ответов

Рейтинг:
29

Richard MacCutchan

Видеть java sudoku - Поиск[^]


Рейтинг:
1

Patrice T

Цитата:
Код судоку с 3d-массивом .

В основном вы описываете игру судоку и смутно описываете, что вы хотите сделать, но у вас нет никаких вопросов, никаких проблем, вы даже не просили нас сделать эту работу. В чем же вопрос ?
Когда вы не уверены в чем-то: экспериментируйте, в худшем случае программа потерпит неудачу..

Совет: я очень рекомендую научиться правильно программировать.
- Следуйте инструкциям.
- Оставьте свои проекты в стороне, пока вы новичок, и делайте игрушечные проекты, которые есть в учебниках.
- Изучите один или несколько методов анализа, У. Е. сверху вниз Djikstra способ это хорошее начало.
https://en.wikipedia.org/wiki/Top-down_and_bottom-up_design[^]
https://en.wikipedia.org/wiki/Structured_programming[^]
https://en.wikipedia.org/wiki/Edsger_W._Dijkstra[^]
https://www.cs.utexas.edu/users/EWD/ewd03xx/EWD316.PDF[^]


Рейтинг:
1

GKP1992

Рекурсивный возврат-самый популярный способ создания программы, которая пытается решить головоломку.
В принципе, программа должна проверить возможность заполнения любого из чисел 1-9 на каждой ячейке матрицы.
Таким образом, вам понадобятся три цикла for, один для строки, один для столбца, который будет идентифицировать рассматриваемую ячейку, а затем еще один цикл for для чисел 1-9.
Затем вы проверите возможность сохранения номера в этой ячейке. Это должно удовлетворять трем условиям,
1. Уже не в строку.
2. уже не находится в колонке.
3. это уже не коробка 3х3.

Первые два условия, я думаю, вы уже знаете, как проверить, поэтому я попытаюсь объяснить для третьего.
Вам нужно будет определить, какой блок 3x3 вы проверяете, это вы можете сделать, используя строку и столбец из первых двух циклов for.
Это можно сделать с помощью функции for следующим образом,

private boolean IsAlreadyInBox (int rowNum, int colNum, int number)
{
    if(rowNum <=3)
       r = 0;
    else if(rowNum > 3 && rowNum <= 6)
       r = 3;
    else
       r = 6;

    if(colNum <=3)
       c = 0;
    else if(colNum > 3 && colNum <= 6)
       c = 3;
    else
       c = 6;

    for(int i = r ; i< r+3 ; i++)
    {
        for(int j = c; j < c+3 ; j++)
        {
            if(matrix[i][j]==number)
            {
                return true;
            }
        }
    }
  return false;
}


Я думаю, что это решит, можно ли заполнить номер в поле или нет.
Я не очень хорошо разбираюсь в Java, поэтому вам, возможно, придется внести некоторые изменения, но идея остается прежней.


Рейтинг:
0

OriginalGriff

Случайная генерация чисел - плохая идея-вам почти наверняка придется вернуться назад, чтобы исправить проблемы: если вы доберетесь до седьмого числа третьей строки и не сможете поместить ни одно из оставшихся трех, потому что все они конфликтуют с другими строками в одной ячейке, то вам нужно вернуться назад и изменить существующие значения.
Взгляните на это:
Алгоритм судоку: генерирует действительное судоку за 0,018 секунды[^]
Создание игры судоку[^]
Судоку solver и генератор[^]
Они не на Яве, но принципы должны помочь.