N황후 문제---심도 우선 검색 알고리즘으로 해답 구하기
2283 단어 수학과 알고리즘
바둑알을 N*N의 바둑판에 놓으면 두 바둑알이 같은 열, 같은 줄과 같은 사대각선에 있을 수 없다
둘.코드
import java.util.HashMap;
import java.util.Map;
public class Queen {
private int count = 0;
private Integer n = 0;
//
private Map location = new HashMap<>();
private Map reverseLocation = new HashMap<>(); //
private static final Integer UNCAPTURED = 0;
private static final Integer CAPTURED = 1;
private int[][] chessboard;
Queen(int n) {
this.n = n;
this.chessboard = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
chessboard[i][j] = UNCAPTURED;
}
}
}
private void dfs(int depth) {
if (depth == n) {
System.out.println("resolution :"+count+" start *****************");
for (Map.Entry entry : location.entrySet()) {
System.out.println("x is:"+entry.getKey()+";y is:"+entry.getValue());
}
System.out.println("resoluction :"+count+" end ********");
count++;
return;
}
for (int i = 0; i < n; i++) {
if (isSatisfied(depth, i)) {
location.put(depth, i);
reverseLocation.put(i, depth);
dfs(depth + 1);
location.remove(depth);
reverseLocation.remove(i);
}
}
}
public int getCount() {
dfs(0);
return count;
}
private boolean isSatisfied(Integer i, Integer j) {
//
if (location.containsKey(i) || reverseLocation.containsKey(j)) {
return false;
}
for (Map.Entry entry : location.entrySet()) {
//
if (Math.abs(entry.getKey() - i) == Math.abs(entry.getValue() - j)) {
return false;
}
}
return true;
}
public static void main(String[] args) {
Queen queen = new Queen(4);
System.out.println(queen.getCount());
}
}