Auf Thema antworten

Hallo Meniskusschaden,


danke für Deine Hilfe. Ja so geht es mit der Initialisierung. Auch für den Zugriff ist die vorab durchgeführte Festlegung der beiden Koordinaten eine gute Lösung.


Ich habe mir zwischenzeitlich auch Gedanken gemacht, bin aber einen anderen Weg gegangen und habe beide Koordinaten für eine Zelle in einen Integer gepackt, in die Bits 0 - 3 den Zeilenindex und in die Bits 4 - 7 den Spaltenindex.


Das sieht dann für die Initialisierung so aus:

[code=Java]    public static final int[][] ZELLNDX = {

        // für Zeilen

        {0, 16, 32, 48, 64, 80, 96, 112, 128},

        {1, 17, 33, 49, 65, 81, 97, 113, 129},

        {2, 18, 34, 50, 66, 82, 98, 114, 130},

        {3, 19, 35, 51, 67, 83, 99, 115, 131},

        {4, 20, 36, 52, 68, 84, 100, 116, 132},

        {5, 21, 37, 53, 69, 85, 101, 117, 133},

        {6, 22, 38, 54, 70, 86, 102, 118, 134},

        {7, 23, 39, 55, 71, 87, 103, 119, 135},

        {8, 24, 40, 56, 72, 88, 104, 120, 136},

        // für Spalten

        {0, 1, 2, 3, 4, 5, 6, 7, 8},

        {16, 17, 18, 19, 20, 21, 22, 23, 24},

        {32, 33, 34, 35, 36, 37, 38, 39, 40},

        {48, 49, 50, 51, 52, 53, 54, 55, 56},

        {64, 65, 66, 67, 68, 69, 70, 71, 72},

        {80, 81, 82, 83, 84, 85, 86, 87, 88},

        {96, 97, 98, 99, 100, 101, 102, 103, 104},

        {112, 113, 114, 115, 116, 117, 118, 119, 120},

        {128, 129, 130, 131, 132, 133, 134, 135, 136}     

    };[/code]

und für den Zugriff so:

[code=Java]    for (int i = 0; i < 9; i++) {

        int zelle = ZELLNDX[b][i];

        if ((sudoku[zelle & 15][zelle >>> 4]) > 0) {

            // ...

        }

    }  [/code]

Die beiden erforderlichen Bitoperationen bei jedem Zugriff auf einen Zellwert verbrauchen sicher nicht mehr Zeit, als der ansonsten erforderliche zweite Lesezugriff.


MfG, kodela



Oben