【问题描述】
给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。
【输入格式】
输入的第一行为一个整数n,表示棋盘的大小。
接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。
【输出格式】
输出一个整数,表示总共有多少种放法。
【样例输入1】
4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
【样例输出1】
2
【样例输入2】
4
1 0 1 1
1 1 1 1
1 1 1 1
1 1 1 1
【样例输出2】
0
并没有完全按照题目上要求来,虽然有点长但是思路明白了就很简单,分享给大家!
import java.util.ArrayList;
import java.util.Scanner;
/*
0 1 2 0
2 0 0 1
1 0 0 2
0 2 1 0
-------
0 2 1 0
1 0 0 2
2 0 0 1
0 1 2 0
*/
public class queen {
public static void main(String[] args) {
Scanner scanner =new Scanner(System.in);
int num=scanner.nextInt();
ArrayList<int[][]> arrayList=new ArrayList<>();
int heinum=0;
int bainum=0;
int sum=0;
int hei=0;
int interval=0;
int bai=1;
while(hei<(num*num-1)) {
heinum=0;
bainum=0;
int[][] arr=new int[num][num];
for(int i=0;i<num;i++) {
for(int j=0;j<num;j++) {
if(hei/num==i && hei%num==j) {
arr[i][j]=1;
heinum++;
}
if(bai/num==i && bai%num==j) {
arr[i][j]=2;
bainum++;
}
}
}
for(int i=0;i<num;i++) {
for(int j=0;j<num;j++) {
if(arr[i][j]==0) {
if(hang(arr,i,j, 1)) {
arr[i][j]=1;
heinum++;
}
}
}
}
for(int i=0;i<num;i++) {
for(int j=0;j<num;j++) {
if(arr[i][j]==0) {
if(hang(arr,i,j, 2)) {
arr[i][j]=2;
bainum++;
}
}
}
}
if(heinum==num && bainum==num) {
boolean boo=true;
for(int i=0;i<arrayList.size();i++){
boo=true;
for(int j=0;j<arr.length;j++){
for(int k=0;k<arr.length;k++){
if (arrayList.get(i)[j][k]!=arr[j][k]){
boo=false;
j=arr.length;
k=arr.length;
}
}
}
if (boo==true){
i=arrayList.size();
}
}
if (boo==false){
for(int i=0;i<num;i++) {
for(int j=0;j<num;j++) {
System.out.print(arr[i][j]);
System.out.print(" ");
}
System.out.println();
}
System.out.println("-------");
arrayList.add(arr);
sum++;
}
if (sum==0){
for(int i=0;i<num;i++) {
for(int j=0;j<num;j++) {
System.out.print(arr[i][j]);
System.out.print(" ");
}
System.out.println();
}
System.out.println("-------");
arrayList.add(arr);
sum++;
}
}
interval++;
bai=bai+1;
if(bai==num*num) {
hei++;
interval=0;
bai=hei+1;
}
}
System.out.println(sum);
}
public static boolean hang(int[][] arr,int a,int b,int value) {
boolean hang=true;
for(int i=0;i<arr.length;i++) {
if(arr[a][i]==value) {
hang=false;
}
if(arr[i][b]==value) {
hang=false;
}
}
int min=a;
if(a>b) {
int a2=a-b;
int b2=0;
min=b;
while(a2!=arr.length && b2!=arr.length) {
if(arr[a2][b2]==value) {
hang=false;
}
a2++;
b2++;
}
}else if(a<b) {
int a2=0;
int b2=b-a;
while(a2!=arr.length && b2!=arr.length) {
if(arr[a2][b2]==value) {
hang=false;
}
a2++;
b2++;
}
}else if(a==b) {
int a2=0;
int b2=0;
while(a2!=arr.length && b2!=arr.length) {
if(arr[a2][b2]==value) {
hang=false;
}
a2++;
b2++;
}
}
if(a+b<3) {
int a3=a+b;
int b3=0;
while(a3!=-1 && b3!=arr.length) {
if(arr[a3][b3]==value) {
hang=false;
}
a3=a3-1;
b3=b3+1;
}
}else if(a+b>3) {
int a3=arr.length-1;
int b3=(a+b)%(arr.length-1);
while(a3!=-1 && b3!=arr.length) {
if(arr[a3][b3]==value) {
hang=false;
}
a3=a3-1;
b3=b3+1;
}
}else if((a+b)==3) {
int a3=arr.length-1;
int b3=0;
while(a3!=-1 && b3!=arr.length) {
if(arr[a3][b3]==value) {
hang=false;
}
a3=a3-1;
b3=b3+1;
}
}
return hang;
}
}