## Thursday, 25 August 2016

### Chapter 7 Exercise 22, Introduction to Java Programming, Tenth Edition Y. Daniel LiangY.

***7.22 (Game: Eight Queens) The classic Eight Queens puzzle is to place eight queens on a chessboard such that no two queens can attack each other (i.e., no two queens are on the same row, same column, or same diagonal). There are many possible solutions. Write a program that displays one such solution. A sample output is shown below:

|Q| | | | | | | |
| | | | |Q| | | |
| | | | | | | |Q|
| | | | | |Q| | |
| | |Q| | | | | |
| | | | | | |Q| |
| |Q| | | | | | |
| | | |Q| | | | |

public class ProgrammingEx7_22 {
public static void main(String[] args) {
int chessboardSize = 8;
int[] chessboard = new int[chessboardSize];
for (int i = 0; i < 077777777; i++) {
int tmp = i;
for (int j = chessboardSize - 1; j >= 0; j--, tmp /= chessboardSize)
chessboard[j] = tmp % chessboardSize;
if (!isHorizonalFine(chessboard))
continue;
if (!isDiagonalFine(chessboard))
continue;
printChessboard(chessboard);
break;
}
}

public static boolean isHorizonalFine(int[] chessboard) {
boolean[] numbers = new boolean[chessboard.length];
for (int i = 0; i < chessboard.length; i++)
numbers[chessboard[i]] = true;
for (int i = 0; i < numbers.length; i++)
if (!numbers[i])
return false;
return true;
}

public static boolean isDiagonalFine(int[] chessboard) {
for (int i = 0; i < chessboard.length; i++) {
for (int j = i + 1; j < chessboard.length; j++) {
if (chessboard[j] - chessboard[i] == j - i)
return false;
if (chessboard[i] - chessboard[j] == j - i)
return false;
}
}
return true;
}

public static void printChessboard(int[] chessboard) {
for (int i = 0; i < chessboard.length; i++) {
for (int j = 0; j < chessboard.length; j++)
System.out.print(chessboard[i] == j ? "|Q" : "| ");
System.out.println("|");
}
System.out.println();
}
}