Javaのプログラムではありませんられる原因はありませんStackOverflowので無限に実行されますが、プログラムが終了したことがない - 数独ジェネレータ

d0rf47:

私は、java 9+における基本的な数独ジェネレータを構築しようとしているに取り組んでいます。

コードは、それが新しい番号、私はログを使用してテストとして、まだ数字を生成しない乱数を生成するが機能を停止し返却前記ランダム点まで、一見正常に動作します。しかし、それは、特定の桁に達し、ちょうど印刷を停止します。私は理由を理解することはできません。あなたが提供することができます任意の洞察力が高く評価されるように、私はアルゴリズムとバックトラッキングに非常に新しいです。

以下のコード

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;
    }
}

ありがとうございました。

マラカス:

あなたのロジックは欠陥があります。あなたがdo-while文で立ち往生されますので、完了することができない構成を作成します。私は簡単な例でこれを実証してみましょう:

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

ボックス7、8または9に既に存在しているため、ドットとの位置のいずれかが、充填することができません。

あなたが数独ソルバーを書くことができ、その後、あなたはグリッドの乱数を配置し、それを解決してみてください。唯一の解が存在するとすぐに(これは下から解くことによって確認することができるように2つの溶液がそれに一致している場合、1を2次に3等とからトップトライ9まず8その後7等を試しますユニークです)、あなたは(あなたが生成しようとしている一人として1を解決していない)数独を持っています。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=341686&siteId=1