技巧
回溯
思路
简单版8皇后问题
实现
import java.io.*;
public class Main {
private static boolean judge(boolean[] visit, int pos, int n) {
while (pos >= 0) {
if (visit[pos]) {
return false;
}
pos -= n;
}
return true;
}
private static int process(int row, int n, int k, String[] chessBoard, boolean[] visit) {
if (k == 0) {
return 1;
}
if (row == n || k > n - row) {
return 0;
}
int cnt = 0;
for (int j = 0; j < n; j++) {
if (chessBoard[row].charAt(j) != '.' && judge(visit, row * n + j, n)) {
visit[row * n + j] = true;
cnt += process(row + 1, n, k - 1, chessBoard, visit);
visit[row * n + j] = false;
}
}
return cnt + process(row + 1, n, k, chessBoard, visit);
}
public static void main(String[] args) throws IOException {
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
while (true) {
String[] nk = br.readLine().split(" ");
int n = Integer.parseInt(nk[0]);
int k = Integer.parseInt(nk[1]);
if (n == -1 && k == -1) {
return;
}
String[] chessBoard = new String[n];
for (int i = 0; i < n; i++) {
chessBoard[i] = br.readLine();
}
System.out.println(process(0, n, k, chessBoard, new boolean[n * n]));
}
}
}

京公网安备 11010502036488号