题目链接P1219
八皇后问题,非常经典的题目,这个题目我们采取逐行的放置皇后的操作,这样可以保证解的顺序肯定是按字典序的顺序输出的,用c数组来保存该行放的皇后到第几列 例如 c[1][1]表示第1行的皇后放在第一列
c[x] == c[j] || x+c[x] == j+c[j] || x-c[x] == j-c[j] 表示皇后是否存在矛盾
代码:
import java.util.*;
public class Main {
static int n = 0; // 皇后个数
static int count = 0; // 解数量
static int c[] = new int[13]; // 用来输出3次的序号
static int t = 0;
static void search(int x){
if(x == n){ // 放置完毕
count++;
if(t < 3){
for(int i = 0;i < n-1;i++)
System.out.print(c[i]+1+" ");
System.out.println(c[n-1]+1);
t++;
}
}
else{
for(int i = 0;i < n;i++){
c[x] = i; // 将第x个皇后放在第i列
boolean ok = false;
for(int j = 0;j < x;j++){ // 判断与前面放的皇后是否冲突
if(c[x] == c[j] || x+c[x] == j+c[j] || x-c[x] == j-c[j]){
ok = true;
break;
}
}
if(!ok) // 如过不冲突放下一个皇后
search(x+1);
}
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
search(0);
System.out.println(count);
}
}