题目描述:
Y9J{PKX{Q~5KR)(KTSR22LO.png
解决方法:
递归+回溯
先铺上一层皇后,再铺一层
import java.util.*;
// 2n皇后自己写系列
public class Queen {
static int count,n;
static int[][] map;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
map = new int[n][n]; // 记得要将map实例化
// 将输入数组值放入map
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
map[i][j] = sc.nextInt();
}
}
// 假设放置白皇后的地方放2,放置黑皇后的地方放3
put(0,2);
System.out.println(count);
}
public static void put(int t,int s){
if( t == n){ // 表示白皇后已经放完
if(s == 2) put(0,3); // 此时开始放置黑皇后
else count++; // 如果黑皇后也已经放置完,count++
return;
}
// 挨层放
for( int i = 0; i < n; i++){
if( map[t][i] != 1) continue; // 该位置不可放任何皇后 结束本次循环
if(check(t,i,s)) map[t][i] = s; // 如果该位置可以放 那么放置皇后
else continue; // 该位置不可放置 结束本次循环
put(t+1,s); // 该层放置成功,则开始放置下一层
map[t][i] = 1; // 回溯,如果下一层放置不成功,则回溯,如果两种皇后都放置成功,则测试下一种可能性
}
return;
}
public static boolean check(int t, int i,int s){
for(int q = t-1; q >= 0; q--){ // 测试该列是否已经放置了皇后
if(map[q][i] == s) return false;
}
for(int q = t-1,p = i-1; q >=0 && p >= 0;q--,p--){ // 测试左对角线是否已经放置了皇后
if(map[q][p] == s) return false;
}
for(int q = t-1,p = i+1; q >= 0&& p < n;q--,p++){ // 测试右对角线是否已经放置了皇后
if(map[q][p] == s) return false;
}
return true;
}
}
网友评论