1

特定の要素について、より大きな配列から配列要素の 3x3 ブロックをチェックする関数を作成しようとしています。

9...84.6.  
..4..75.8  
.3.......  
3....1...  
.7.5.6.4.  
...4....2  
.......5.  
5.97..2..  
.8.21...4

0 ~ 8 の番号が付けられたボックスを渡し、選択したボックス内でのみ x を探します。パズル配列は上記のようなものです。

protected static boolean box(int box, int x){
//box is a 3x3 subset of puzzle
//  012
//  345    <--- boxes numbered as such
//  678
    boolean present = false;
    int coordR = 0, coordC = 0;

    switch (box){
        case 0:
            coordR = 0;
            coordC = 0; 
        case 1:
            coordR = 0;
            coordC = 3;
        case 2:
            coordR = 0;
            coordC = 6;
        case 3:
            coordR = 3;
            coordC = 0;
        case 4:
            coordR = 3;
            coordC = 3;
        case 5:
            coordR = 3;
            coordC = 6;
        case 6:
            coordR = 6;
            coordC = 0;
        case 7:
            coordR = 6;
            coordC = 3;
        case 8:
            coordR = 6;
            coordC = 6;
    }
    System.out.print("Box " + box + " -\t");
    for (int i = coordR; i < 3; i++){
        for (int j = coordC; j < 3; j++){
            if (puzzle[i][j] == x){
                present = true;
                }
            System.out.print(puzzle[i][j]);
        }
    }
    System.out.println("");
    return present;
}

これを行う/これを機能させるより効率的な方法はありますか?

4

1 に答える 1

0

Sure:

protected static boolean box(int box, int d) {
    int boxY = box / 3;
    int boxX = box - (boxY * 3);

    int minX = boxX * 3;
    int maxX = minX + 3;
    int minY = boxY * 3;
    int maxY = maxX + 3;

    for (int y = minY; y < maxY; y++)
        for (int x = minX; x < maxX; x++)
            if (puzzle[x][y] == d) 
                return true;
    return false;
}    

For future reference: You should not forget the break statements in a switch statement.

于 2012-09-10T01:54:39.403 に答える