85 王、后传说
作者: turbo时间限制: 1S章节: 递归
问题描述 :
地球人都知道,在国际象棋中,后如同太阳,光芒四射,威风八面,它能控制横、竖、斜线位置。
看过清宫戏的中国人都知道,后宫乃步步惊心的险恶之地。各皇后都有自己的势力范围,但也总能找到相安无事的办法。
所有中国人都知道,皇权神圣,伴君如伴虎,触龙颜者死…
现在有一个n*n的皇宫,国王占据他所在位置及周围的共9个格子,这些格子皇后不能使用(如果国王位于王宫的边缘,占用的格子可能不到9个)。当然,皇后也不会攻击国王。
现在知道了皇宫的规模n,国王的位置(x,y)(国王位于第x行第y列,行和列号从1开始),请问,有多少种方案放置n个皇后,使她们不能互相攻击(同一横线、竖线、斜线上只能有一个皇后)。
输入说明 :
输入仅一行,包含三个整数,表示皇宫的规模n(n<=12)及国王的位置x和y坐标。
输出说明 :
一个整数,表示放置n个皇后的方案数
输入范例 :
8 2 2
输出范例 :
10
import java.util.Scanner;
public class test_85 {
/**
* 85 王、后传说
*/
private static int count = 0;
private static int[][] a;
private static int[] column;
private static int n;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
int x = sc.nextInt();
int y = sc.nextInt();
//首先判断皇上的范围
/*
* X X X X X
* X X X X X
* X X HS X X
* X X X X X
* X X X X X
*/
int rowStart = x-1 >=1 ? x - 2 : 0;//行开始
int rowEnd = x< n - 1 ? x : n - 1;//行结束
int colStart = y-1 >=1 ? y - 2 : 0;//列开始
int colEnd = y < n - 1 ? y : n - 1;//列结束
//皇上所占区域 置1
a = new int[n][n];// 1-n
for (int i = rowStart; i <= rowEnd; i++) {
for (int j = colStart; j <= colEnd; j++) {
a[i][j] = -1;
}
}
column = new int[n];
DFS(0);
System.out.println(count);
}
private static void DFS(int row){
//递归返回条件
if(row==n){
//转向放置黑皇后
count++;
}
else for(int col=0;col<n;col++){
if(isLegal(row,col)){
column[row]=col;
//置0
a[row][col]=2;
//进入下一行
DFS(row+1);
//恢复
a[row][col]=1;
column[row]=0;
}
}
}
private static boolean isLegal(int row, int col) {
if (a[row][col] == -1 || a[row][col]==2) {
return false;
}
for (int i = 0; i <row; i++) {
//同列
if (column[i] == col) {
return false;
}
//同一对角线上 column[]数组里面存放的是对应的行里选取的列的值
//处于同一对角线上的坐标(x1,y1),(x2,y2) |y1-y2|==|x1-x2|(主对角线,副对角线均要满足)
if (Math.abs(column[i] - col) == Math.abs(i - row)) {
return false;
}
}
return true;
}
}