1 / 48

8-Queens Puzzle

8-Queens Puzzle. Basic Rules. The board: a matrix of size N X N. In standard chess: N = 8. Basic Rules. The queen - moves horizontally, vertically, or diagonally. Basic Rules.

fculberson
Download Presentation

8-Queens Puzzle

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 8-Queens Puzzle

  2. Basic Rules The board: a matrix of size N X N. In standard chess: N = 8.

  3. Basic Rules The queen - moves horizontally, vertically, or diagonally.

  4. Basic Rules The queen - moves horizontally, vertically, or diagonally.Can attack anypiece on its way.

  5. Basic Rules The queen - moves horizontally, vertically, or diagonally.Can attack anypiece on its way.

  6. Basic Rules Two queens threaten each other if they are on the same vertical, horizontal, or diagonal line.

  7. Basic Rules Two queens threaten each other if they are on the same vertical, horizontal, or diagonal line.

  8. 8-Queens puzzle Place 8 queens on the board such that no two queens are threatening each other.

  9. 8-Queens puzzle Place 8 queens on the board such that no two queens are threatening each other.

  10. Recursive (non-OOP) solution

  11. Place a queen at a non-threatened cell.

  12. Place a queen at a non-threatened cell.

  13. Place a queen at a non-threatened cell.

  14. Place a queen at a non-threatened cell.

  15. Place a queen at a non-threatened cell.

  16. Place a queen at a non-threatened cell.

  17. Place a queen at a non-threatened cell.

  18. Place a queen at a non-threatened cell.

  19. Backtrack.

  20. Backtrack.

  21. Place a queen at a non-threatened cell.

  22. Place a queen at a non-threatened cell.

  23. Place a queen at a non-threatened cell. Backtrack…

  24. publicstaticvoid main(String args[]){ finalint N = 8; int [][] board = newint[N][N]; init(board); solve(board,N); } publicstaticboolean solve(int [][] board, int cnt){ if (cnt == 0){ print(board); returntrue; } boolean solved = false; if (cnt > 0 && !solved){ for (int i = 0; i < board.length && !solved; i++) for (int j =0; j < board[i].length && !solved; j++) if (board[i][j] == FREE){ //FREE – a constant, equals 0 int [][] newBoard = cloneBoard(board); newBoard[i][j] = QUEEN; // QUEEN - a constant, equals 1 threaten(newBoard,i,j); solved = solve(newBoard, cnt - 1); } } return solved; }

  25. publicstaticvoid threaten(int [][] board, int i, int j){ for (int x = 0; x < board[i].length; x++){ if (board[i][x] == FREE) board[i][x] = THREAT; // const. eq. 2 } for (int y = 0; y < board.length; y++ ){ if (board[y][j] == FREE) board[y][j] = THREAT; } int ltx,lty, rtx,rty, lbx,lby, rbx, rby; ltx = rtx = lbx = rbx = i; lty = rty = lby = rby = j; for (int z = 0; z < board.length; z++){ if (board[ltx][lty] == FREE) board[ltx][lty] = THREAT; if (board[rtx][rty] == FREE) board[rtx][rty] = THREAT; if (board[lbx][lby] == FREE) board[lbx][lby] = THREAT; if (board[rbx][rby] == FREE) board[rbx][rby] = THREAT;

  26. publicstaticvoid threaten(int [][] board, int i, int j){ for (int x = 0; x < board[i].length; x++){ if (board[i][x] == FREE) board[i][x] = THREAT; // const. eq. 2 } for (int y = 0; y < board.length; y++ ){ if (board[y][j] == FREE) board[y][j] = THREAT; } int ltx,lty, rtx,rty, lbx,lby, rbx, rby; ltx = rtx = lbx = rbx = i; lty = rty = lby = rby = j; for (int z = 0; z < board.length; z++){ if (board[ltx][lty] == FREE) board[ltx][lty] = THREAT; if (board[rtx][rty] == FREE) board[rtx][rty] = THREAT; if (board[lbx][lby] == FREE) board[lbx][lby] = THREAT; if (board[rbx][rby] == FREE) board[rbx][rby] = THREAT; if (ltx >0 && lty >0){ ltx--; lty--; } if (rbx < board.length - 1 && rby < board.length - 1 ){ rbx++; rby++; } if (rtx < board.length -1 && rty > 0){ rtx++; rty--; } if (lbx > 0 && lby < board.length - 1){ lbx--; lby++; } } //end of for } // end of function threaten

  27. OOP solution

  28. Main ideas • Each queen is an autonomous agent! • Each queen has its own fixed column. • Queens are added to the board from left to right. • A queen tries to find a safe position in its column. • If no safe position is found, then the queen asks its neighbors to advance to the next legal position. (In which no two neighbors threaten each other.)

  29. Queen class diagram Queen - row : int // current row number (changes) - column : int // column number (fixed) - Neighbor : Queen // neighbor to left (fixed) + findSolution // find acceptable solution for self and neighbors + advance // advance row and find next acceptable solution + canAttack // see whether a position can be attacked by self or neighbors

  30. Neighbor Queen class diagram Queen - row : int // current row number (changes) - column : int // column number (fixed) + findSolution // find acceptable solution for self and neighbors + advance // advance row and find next acceptable solution + canAttack // see whether a position can be attacked by self or neighbors

  31. A queen places itself at a safe position in its column.

  32. A queen places itself at a safe position in its column.

  33. A queen places itself at a safe position in its column.

  34. A queen places itself at a safe position in its column.

  35. A queen places itself at a safe position in its column.

  36. No safe position for queen 6 at column 6. Asks neighbor (queen 5) to change position.

  37. No safe position for queen 6 at column 6. Asks neighbor (queen 5) to change position.

  38. Queen 5 is at the last row. Asks neighbor (queen 4) to change position.

  39. A queen places itself at a safe position in its column.

  40. A queen places itself at a safe position in its column.

  41. A queen places itself at a safe position in its column.

  42. A queen places itself at a safe position in its column.

  43. No safe position for queen 8 at column 8. Proceed the search in a similar way…

  44. public class Queen{ … public Queen (int column, Queen neighbor) { this.row = 1; this.column = column; this.neighbor = neighbor; } ….. public static void main(String args[]){ Queen lastQueen = null; for (int i = 1; i <= N; i++) { \\ N equals 8 lastQueen = new Queen(i, lastQueen); lastQueen.findSolution(); }

  45. public boolean findSolution() { while (this.neighbor != null && this.neighbor.canAttack(this.row, this.column)) boolean advanced = this.advance(); if (!advanced) return false; return true; }

  46. private boolean canAttack(int testRow, int testColumn) { int columnDifference = testColumn – this.column; if ((this.row == testRow) || (this.row + columnDifference == testRow) || (this.row - columnDifference == testRow)) return true; if (this.neighbor != null) return neighbor.canAttack(testRow, testColumn); return false; }

  47. public boolean advance() { if (this.row < N) { \\ N equals 8 this.row++; return this.findSolution(); { if (this.neighbor != null) { boolean advanced = this.neighbor.advance()); if (!advanced) return false; row = 1; return findSolution(); { else return false; }

More Related