Auf Thema antworten

hallo ich würde gerne folgenden rekursiven algorithmus in eine iterative methode umschreiben:

[code=Java]

public Class Queens {

static int n = 0;

static in m = 0;

public static void main(String[] args){

        long time = System.currentTimeMillis();

        n = 3;

        m = n-1;

        boolean[][] checkField = new boolean[3][];

        byte[] placedQueen = new byte[n];

        // 0 = horizontal, 1 = upper diagonal, 2 = lower diagonal

        checkField[0] = new boolean[n];

        checkField[1] = new boolean[2*n - 1];

        checkField[2] = new boolean[2*n - 1];

        System.out.println("Felder: " + n);

        System.out.println("Lösungen: " + solveIter(checkField, placedQueen));

        System.out.println("Programm braucht: " + (System.currentTimeMillis() - time) + "ms.");

   

    }

   

    private static int solve(int i, boolean[][] checkField) {

        int k = 0;

        int solution = 0;

        while(k < n){        // checks first column, top -> down

            if(i+1 < n) {    // checks if we are in last column

                if(checkField[0][k] || checkField[1][k+i] || checkField[2][i-k+m]);

                else {                        // computes the remaining available queen positions

                    checkField[0][k] = true; // set row taken

                    checkField[1][k+i] = true; // set upper diagonal taken

                    checkField[2][i-k+m] = true; // set lower diagonal taken

                   

                    solution += solve(i+1, checkField);

                    //reset last queen positioning

                    checkField[0][k] = false;

                    checkField[1][k+i] = false;

                    checkField[2][i-k+m] = false;

                }

            }   

           

            else {    // computes solution

                if(checkField[0][k] || checkField[1][k+i] || checkField[2][i-k+m]);

                else{

                    solution++;

                }

            }

                k++;

           

    }

        return solution;

    }[/code]



mein lösungsansatz sieht momentan folgendermaßen aus:


[code=Java]

    private static int solveIter(boolean[][] checkField, byte[] placedQueen) {

        byte i = 0;

        int solution = 0;

        byte row = 0;

            while(i < n) {    // goes through all column

                // testoutprint: System.out.println("i: " + i + " row: " + row + " z+i: " + (row+i) + " i-z+m: " + (i-row+m));

                if(checkField[0][row] || checkField[1][row+i] || checkField[2][i-row+m]){

                    if(row == m){

                        // reset last queen positioning

                        i--;

                        row = placedQueen[i];

                        placedQueen[i] = 0;

                        checkField[0][row] = false;

                        checkField[1][row+i] = false;

                        checkField[2][i-row+m] = false;

                        }

                    else{

                     row++; }

                }

                else {        // computes the remaining available queen positions

                    if(i == m){

                        //  computes solution

                        solution++;

                        row++;

                    }

                    else{

                    checkField[0][row] = true; // set row taken

                    checkField[1][row+i] = true; // set upper diagonal taken

                    checkField[2][i-row+m] = true; // set lower diagonal taken

                    placedQueen[i] = row;

                    i++;

                    row = 0;

                    }

                }

            }   

           

   

        return solution;

    }

}[/code]



ich kriegs aber nicht hin, dass das zurücksetzen der bedrohung in der iter methode funktioniert, dass was beim rekursiven nach dem letzten abstieg passiert.



edit: ausm zweiten codestück den doppelcopy entfernt.



Der Algorithmus soll das n-damen-problem lösen und die anzahl möglicher stellungen (spiegelungen nicht beachtet) ausgeben. Die solve() methode setzt dafür immer eine Dame weiter und sobald sie einmal am ende angekommen ist, wird angefangen immer wieder eine Dame zu entfernen und eine neue Dame woanders zu setzen, solang bis alle möglichkeiten durchprobiert sind.


Das Problem für meine iterative Variante liegt für mich dabei java iterativ zu sagen, dass er diesen einen schritt zurück gehn soll und dann quasi wieder das selbe wie vorher machen. eben dass was die rekursive methode brav durch selbstaufruf und dem wegnehmen einer dame nach durchlauf einer tieferen instanz tut.



Oben