Java Программа работает бесконечно без причины - Нет StackOverflow, но программа никогда не завершается - генератор судоку - PullRequest
1 голос
/ 20 марта 2020

Я работаю над попыткой построить базовый c генератор судоку в java 9 +.

Код работает на первый взгляд нормально до случайной точки, в которой он перестает возвращать новое число, однако функция генерация случайного числа все еще производит числа, как я проверял с журналом. Но он достигает определенного значения git и просто останавливает печать. Я не могу понять, почему. Я очень плохо знаком с алгоритмами и отслеживанием, поэтому любая информация, которую вы можете предоставить, ценится.

Код ниже

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

class Scratch_5
{

    static boolean safe = true;
    static int[][] grid = new int[9][9];
    public static void main(String[] args)
    {
        for(int i = 0; i < grid.length; i++)
        {
            for(int j = 0; j < grid[i].length; j++)
            {
                int temp = 0;
                do
                {
                    temp = getNumber();
                }while (!noConflict(grid, i, j, temp));
                grid[i][j] = temp;
                System.out.print(grid[i][j] + " ");
            }
            System.out.println();
        }

    }

    static int getNumber()
    {
        Random r = new Random();

        int temp = 0;
        temp = r.nextInt(10-0);
        return temp;
    }
    public static boolean noConflict(int[][] array, int row, int col, int num) {

        for (int i = 0; i < 9; i++) {
            if (array[row][i] == num) {
                return false;
            }
            if (array[i][col] == num) {
                return false;
            }
        }

        int gridRow = row - (row % 3);
        int gridColumn = col - (col % 3);
        for (int p = gridRow; p < gridRow + 3; p++) {
            for (int q = gridColumn; q < gridColumn + 3; q++) {
                if (array[p][q] == num) {
                    return false;
                }
            }
        }
        return true;
    }
}

Спасибо.

1 Ответ

2 голосов
/ 20 марта 2020

Ваш лог c имеет недостатки. Вы создадите конфигурации, которые не могут быть завершены, поэтому вы застрянете в do, пока l oop. Позвольте мне продемонстрировать это на простом примере:

1 2 3 4 5 6 7 8 9
4 5 6 1 2 3 . . .

Ни одна из позиций с точкой не может быть заполнена, поскольку в ячейке уже есть 7, 8 или 9.

Вы Можно написать решатель судоку, затем вы поместите случайные числа в сетку и попытаться решить ее. Как только найдется уникальное решение (это можно проверить, решив снизу, попробуйте 1, затем 2, затем 3 и т. Д., А сверху попробуйте сначала 9, затем 8, 7 и т. Д., Если 2 решения совпадают с ним. уникален), у вас есть судоку (не решенный, как тот, который вы пытаетесь сгенерировать).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...