1

私が取り組んでいる課題では、クラス、メソッド、カプセル化などを使用せずに数独ゲームを作成する必要があります。ユーザーが「fourArray」または「nineArray」に入力した値に重複値が含まれていないことを検証するのに問題があります。これまでのところ、いずれかの配列の列と行の両方を反復処理するために、ネストされた for ループを使用しようとしました。たとえば、重複する値があるかどうかを判断するために、プログラムの最後に次のコードを含めようとしています。

for (int i = 0; i < fourArray.length; i++) {
    for (int j = i + 1; j < fourArray.length; j++)
        if (fourArray[i] == fourArray[j]) {
            System.out.println("No Sudoku");
        } else {
            System.out.println("Sudoku!);
        }
 }

ただし、これは機能していません。配列を反復処理して重複する値を見つけ、何もない場合は「数独!」と出力します。重複する値がある場合は、「Sudoku!」を出力したいと思います。配列をソートする必要はありますか? または、私が気付いていない方法がありますか?私は自分のプログラムを含めました。お時間をいただきありがとうございます。

import java.util.Scanner;


public class Sudoku {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int boardSize = -1;
        int[][] fourArray = { {0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0} };
        int[][] nineArray = { {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0} }; 
        while (true)
        {
            Scanner boardsizeOption = new Scanner(System.in);
            System.out.println("Please select a board size:" + "\n" + "1) 4x4" + "\n" + "2) 9x9");
            boardSize = boardsizeOption.nextInt();
            if (boardSize == 1 || boardSize == 2) {
                break;
            }
        }
        if (boardSize == 1) { //still need to build complete board 
            int i, j = 0;
            for (i = 0; i < fourArray.length; i++)
            {
                for (j = 0; j < fourArray.length; j++)
                    System.out.print(fourArray[i][j] + " ");
                System.out.println();
            }
        } else if (boardSize == 2) { 
            int i, j = 0;
            for (i = 0; i < nineArray.length; i++)
            {
                for (j = 0; j < nineArray.length; j++)
                    System.out.print(nineArray[i][j] + " ");
                System.out.println();
            }
    }
        int dataSelection = -1;     
        while (true)
        {
            Scanner rowColumn = new Scanner(System.in);
            System.out.println("Please select which way you would like to enter the values:" + "\n" + "1) row" + "\n" + "2) columnn");
            dataSelection = rowColumn.nextInt();
            if (dataSelection == 1 || dataSelection == 2) {
                break;
            }
        }
        //Entering by ROWS
        //This is for a 4x4 board size using rows
        if (dataSelection == 1) {
            if (boardSize == 1) {
                int row = 1;
                while (row < 5) {
                    String row1Values4x4 = "-1";
                    while (true) {
                        Scanner firstRow4x4 = new Scanner(System.in);
                        System.out.println("Please enter four values using commas for row " + row); //this needs to loop
                        row1Values4x4 = firstRow4x4.next();
                        row1Values4x4 = row1Values4x4.replaceAll(" ",""); //this is in case user enters numbers with spaces
                        if (row1Values4x4.length() == 7) {
                            break;
                        }
                    }
                    String strArray[] = row1Values4x4.split(",");
                    int arraySidesInteger[] = new int[strArray.length];
                    for (int i = 0;  i < strArray.length;  i++) {
                        arraySidesInteger[i] = Integer.parseInt(strArray[i]);
                    }
                    fourArray[row-1] = arraySidesInteger;
                    for (int i = 0; i < fourArray.length; i++) {
                        for (int j = 0; j < fourArray.length; j++)
                            System.out.print(fourArray[i][j] + " ");
                        System.out.println();
                    }
                    row++;
                }
                //This is for a 9x9 board size using rows 
                } else { 
                    int row = 1;
                    while (row < 10) {
                        String row1Values9x9 = "-1";
                        while (true) {
                            Scanner firstRow9x9 = new Scanner(System.in);
                            System.out.println("Please enter nine values using commas for row " + row); //this needs to loop
                            row1Values9x9 = firstRow9x9.next();
                            row1Values9x9 = row1Values9x9.replaceAll(" ",""); //this is in case user enters numbers with spaces
                            if (row1Values9x9.length() == 17) {
                                break;
                            }
                        }
                        String strArray[] = row1Values9x9.split(",");
                        int arraySidesInteger[] = new int[strArray.length];
                        for (int i = 0;  i < strArray.length;  i++) {
                            arraySidesInteger[i] = Integer.parseInt(strArray[i]);
                        }
                        nineArray[row-1] = arraySidesInteger;
                        for (int i = 0; i < nineArray.length; i++) {
                            for (int j = 0; j < nineArray.length; j++)
                                System.out.print(nineArray[i][j] + " ");
                            System.out.println();
                        }
                        row++;
                    }
                }
            //Entering by COLUMNS
            //This is for 4x4 board size using columns 
            } else { 
                if (boardSize == 1) {
                    int column = 1;
                    while (column < 5) {
                        String column1Values4x4 = "-1"; 
                        while (true) {
                            Scanner firstColumn4x4 = new Scanner(System.in);
                            System.out.println("Please enter four values using commas for column " + column);
                            column1Values4x4 = firstColumn4x4.next();
                            column1Values4x4 = column1Values4x4.replaceAll(" ","");
                            if (column1Values4x4.length() == 7) {
                                break;
                            }
                        }
                        String strArray[] = column1Values4x4.split(",");
                        int arraySidesInteger[] = new int[strArray.length];
                        for (int i = 0;  i < strArray.length;  i++) {
                            arraySidesInteger[i] = Integer.parseInt(strArray[i]);
                        }
                        for (int i = 0; i < arraySidesInteger.length; i++) {
                            fourArray[i][column-1] = arraySidesInteger[i];
                        }
                        for (int i = 0; i < fourArray.length; i++) {
                            for (int j = 0; j < fourArray.length; j++)
                                System.out.print(fourArray[i][j] + " ");
                            System.out.println();
                        }
                        column++;
                    }
                //This is for a 9x9 board size using columns
                } else { 
                    int column = 1;
                    while (column < 10) {
                        String column1Values9x9 = "-1";
                        while (true) {
                            Scanner firstColumn9x9 = new Scanner(System.in);
                            System.out.println("Please enter nine values using commas for column " + column);
                            column1Values9x9 = firstColumn9x9.next();
                            column1Values9x9 = column1Values9x9.replaceAll(" ","");
                            //row1Values4x4 = row1Values4x4.replaceAll(",","");
                            if (column1Values9x9.length() == 17) {
                                break;
                            }
                        }
                        String strArray[] = column1Values9x9.split(",");
                        int arraySidesInteger[] = new int[strArray.length];
                        for (int i = 0;  i < strArray.length;  i++) {
                            arraySidesInteger[i] = Integer.parseInt(strArray[i]);
                        }
                        for (int i = 0; i < arraySidesInteger.length; i++) {
                            nineArray[i][column-1] = arraySidesInteger[i];
                        }
                        for (int i = 0; i < nineArray.length; i++) {
                            for (int j = 0; j < nineArray.length; j++)
                                System.out.print(nineArray[i][j] + " ");


                    System.out.println();
                    }
                    column++;
                }
            }
            for (int i = 0; i < fourArray.length; i++) {
                for(int j = i + 1; j < fourArray.length; j++) {
                    if(fourArray[i] == fourArray[j]) {
                        System.out.println("No Sudoku");
                    } else {
                        System.out.println("Sudoku!");
                    }
            }
        }
    }
}
4

2 に答える 2

4

宿題なので、コードを最小限に抑えますが、2D 配列に関する詳細情報があれば、理解できると思います。その中にはかなりトリッキーなものもあります。

  • fourArrayは配列の配列であるため、配列を参照fourArray[i]します (2 次元配列の i 番目の行と考えることができます)。
  • 配列の配列内の個々の整数にアクセスするには、 を使用しますfourArray[i][j]
  • myArray1 == myArray2 を実行すると (コードが現時点で本質的に行っているように)、コンテンツは比較されません。むしろ、それらが実際に同じ配列であるかどうかをチェックします (最初に言った場合に起こるようにmyArray1 = myArray2)。
  • 2 つの配列の内容を比較したい場合は、 を使用できますArrays.equals(myArray1, myArray2)
  • 上記の点から、fourArray.lengthは 1 次元のサイズです。fourArray[x].lengthは他の次元のサイズです (と の間にxある限り、どこでも問題ありません)。0fourArray.length - 1

コメントに応じて追加:私の理解と仮定は、 2-D に含まれる値の間で重複する値を回避しようとしているということですfourArray。いくつかの解決策があります。

単純な解決策と呼ばれる可能性があるのは、最初にネストされたforループのペアを使用して の各値を処理することfourArrayです。これらの値のそれぞれについて、他のすべての値と比較します。中間コードは次のようになります。

for (int i = 0; i < fourArray.length; i++) {
    for (int j = 0; j < fourArray[i].length; j++) {
        // TODO: Compare value at (i,j) to every other point by nesting
        // two more for loops with new iterators (called, e.g., m and n)
        // TODO: If a duplicate is found, either stop searching, or at
        // least mark that a duplicate has been found somehow.
    }
}

一方では、これは少し非効率的です。一方、小さな 2 次元配列の場合、計算的にはまだ完全に自明なので、それが理にかなっている場合は、それを実行して他の問題に進んでください。

ただし、興味があり、許可された値が連続したセットの一部であるという前提で、検討のために別のアイデアを提出します (つまり、典型的な数独ゲームでは、許可された値が常に 1- 9、決して高くない)。count[]これらの既知の値が何回発生したかを追跡する配列があるとしたら? したがって、その中のすべての値はゼロに初期化されます。(上記のコード サンプルに示すように) テーブル内の各スポットを反復処理すると、見つかった値を使用して、それを呼び出して、vインクリメントすることができますcount[v]count[]1 より大きい値は重複を表します。

于 2013-07-17T23:47:50.690 に答える
0

まず、クラス コード全体で、数独チェックを 1 つ下に移動する必要があります}(その後はメインとクラスの 2 つだけにする必要があります)。

2 番目のことは、問題を正しく理解していると仮定して、あなたが考えたように、二重の for ループが間違っていることです。グリッド内の他のすべての値に対してすべての値をチェックする場合は、次のようにします。

    boolean sudoku = true;
    for (int i = 0; i < fourArray.length; i++) {
        for (int j = 0; j < fourArray[i].length; j++) {
            if (fourArray[i] == fourArray[j]) {
                sudoku = false;
                break;
            } 
            if (!sudoku){
                break;
            }
        }
    }
    if (sudoku){
        System.out.println("Sudoku!");
    } else {
        System.out.println("No Sudoku!");
    }
于 2013-07-17T21:20:57.097 に答える