jackie
jackie

Reputation: 644

Java Loop is not doing what It should be doing

Had a problem with the recursive conflictCheck() method. That seems fine now. I have print lines for testing, that look good. Now, when something is a conflict (returns true), my playChess() method is supposed to fix the conflict by adjusting the node's second variable, and so on.

My result is literally:

1,1

2,3

3,1

4,3

5,1 ...

Even though the output says "oh we have a conflict" it doesn't act on it once it reaches x,3

    public static boolean conflictCheck(QueenNode a, QueenNode b) {
    //checks for conflicts between head and all other nodes in the stack
    if (b == null) {
        System.out.println("Attempting Conflict Check: Nothing to Compare to");
        return false;
    }

    if (a.getRow()!=b.getRow() && a.getColumn()!=b.getColumn() && !diagonal(a,b)){
        System.out.println("Comparing " + a.getRow() + " ," + a.getColumn() +
                                    " And " + b.getRow() + " , " + b.getColumn());
        conflictCheck(a,b.getNext());
    }
    else {
        System.out.println("There is a conflict with " +a.getRow() + "," + a.getColumn()
                            + " And " + b.getRow() + "," + b.getColumn());
        return true;
        }
    return false;
}


    public static void playChess() {
    System.out.println("Playing chess");
    //Either there is a conflict between head and another node, the stack isn't full, or we have solution
    if (conflictCheck(head, head.getNext())) {
        if (head.getColumn() == 8) {
            queens.pop();
        }
        else if (!queens.isEmpty()) {
            System.out.println("Adjusting head");
            head.setColumn(head.getColumn()+1);
            System.out.println("Head is now " + head.getRow() + ", " + head.getColumn());
            playChess();

        }
    }

    else if (queens.size() < 8) {
        System.out.println("Stack isn't full yet");
        queens.push(queens.size()+1,1);
        queens.viewPieces();
        playChess();
        }
    else {
        success= true;
        System.out.println("Success");
        queens.viewPieces();
        return;
    }
}

The entire output:

The stack
1, 1
End of stack
Playing chess
Attempting Conflict Check: Nothing to Compare to
Stack isn't full yet
The stack
2, 1
1, 1
End of stack
Playing chess
There is a conflict with 2,1 And 1,1
Adjusting head
Head is now 2, 2
Playing chess
problem
There is a conflict with 2,2 And 1,1
Adjusting head
Head is now 2, 3
Playing chess
Comparing 2 ,3 And 1 , 1
Attempting Conflict Check: Nothing to Compare to
Stack isn't full yet
The stack
3, 1
2, 3
1, 1
End of stack
Playing chess
Comparing 3 ,1 And 2 , 3
There is a conflict with 3,1 And 1,1
Stack isn't full yet
The stack
4, 1
3, 1
2, 3
1, 1
End of stack
Playing chess
There is a conflict with 4,1 And 3,1
Adjusting head
Head is now 4, 2
Playing chess
problem
There is a conflict with 4,2 And 3,1
Adjusting head
Head is now 4, 3
Playing chess
Comparing 4 ,3 And 3 , 1
There is a conflict with 4,3 And 2,3
Stack isn't full yet
The stack
5, 1
4, 3
3, 1
2, 3
1, 1
End of stack
Playing chess
Comparing 5 ,1 And 4 , 3
There is a conflict with 5,1 And 3,1
Stack isn't full yet
The stack
6, 1
5, 1
4, 3
3, 1
2, 3
1, 1
End of stack
Playing chess
There is a conflict with 6,1 And 5,1
Adjusting head
Head is now 6, 2
Playing chess
problem
There is a conflict with 6,2 And 5,1
Adjusting head
Head is now 6, 3
Playing chess
Comparing 6 ,3 And 5 , 1
There is a conflict with 6,3 And 4,3
Stack isn't full yet
The stack
7, 1
6, 3
5, 1
4, 3
3, 1
2, 3
1, 1
End of stack
Playing chess
Comparing 7 ,1 And 6 , 3
There is a conflict with 7,1 And 5,1
Stack isn't full yet
The stack
8, 1
7, 1
6, 3
5, 1
4, 3
3, 1
2, 3
1, 1
End of stack
Playing chess
There is a conflict with 8,1 And 7,1
Adjusting head
Head is now 8, 2
Playing chess
problem
There is a conflict with 8,2 And 7,1
Adjusting head
Head is now 8, 3
Playing chess
Comparing 8 ,3 And 7 , 1
There is a conflict with 8,3 And 6,3
Success
The stack
8, 3
7, 1
6, 3
5, 1
4, 3
3, 1
2, 3
1, 1
End of stack

Upvotes: 1

Views: 87

Answers (1)

Sergey Kalinichenko
Sergey Kalinichenko

Reputation: 727067

Since this is homework, there's a small hint:

The reason that you do not act on a conflict that you detect is most likely because you ignore the return value of conflictCheck(a,b.getNext()); that you call recursively from boolean conflictCheck(QueenNode a, QueenNode b).

The problem of eight queens is explored in depth in this excellent work by E.W.Dijkstra on page 72. It's coded in ALGOL-60 (which become obsolete even before my time), but the ideas are language-agnostic.

Upvotes: 2

Related Questions