public class test04 {
static int length=8;//棋盘长度
static int count=0;//统计结果
/**
* 在8×8格的国际象棋盘上摆放8个皇后,使其不能互相攻击 即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法
*/
public static void main(String[] args) {
int[][] a = new int[length][length];
//SetA(a);//初始化
CreatA(a, -1, -1, false);
System.out.println("如上共有"+count+"种算法");
}
/**
* 可以确定 每一行各有一个皇后
* a 棋盘
* cindex 行标
* rindex 列标
* bool 是否第一次运行
*/
private static void CreatA(int[][] a, int cindex, int rindex, boolean bool) {
//第一次运行不添加皇后
if (bool) {
a[cindex][rindex] = 1;
if (cindex == length-1) {
if(ChackA(a)){
count++;
DrowA(a);
System.out.println();
System.out.println();
System.out.println();
}
}
}
//每添加一个皇后就进行检查,确认当前的棋盘是否符合要求
if (ChackA(a)) {
if (cindex < length-1) {
cindex++;
for (int i = 0; i < length; i++) {
int[][] aCopy=new int[length][length];
for(int iCopy=0,jCopy=0;jCopy<length;iCopy++)
{
aCopy[iCopy][jCopy]=a[iCopy][jCopy];
if(iCopy==length-1)
{
jCopy++;
iCopy=-1;
}
}
CreatA(aCopy, cindex, i, true);
}
}
}
}
private static boolean ChackA(int[][] a) {
//检查行是否有一个以上皇后
int num = 0;
for (int i = 0, j = 0; i < a.length; j++) {
num += a[i][j];
if (j == a[i].length - 1) {
j = -1;
i++;
if (num > 1)
return false;
num = 0;
}
}
//检查列是否有一个以上皇后
for (int i = 0, j = 0; j < length; i++) {
num += a[i][j];
if (i == length-1) {
i = -1;
j++;
if (num > 1)
return false;
num = 0;
}
}
//检查135°是否有一个以上皇后
for(int i=0, j=0;j<length-1;)
{
i=j;
for(int inde=0;inde<length-j;inde++,i++)
{
num+=a[inde][i];
}
if (num > 1)
return false;
num = 0;
i=j;
for(int inde=0;inde<length-j;inde++,i++)
{
num+=a[i][inde];
}
if (num > 1)
return false;
num = 0;
j++;
}
//检查45°是否有一个以上皇后
for(int i=0,j=0;j<length-1;)
{
i=j;
for(int inde=0;inde<length-j;inde++,i++)
{
num+=a[inde][length-1-i];
}
if(num>1)
return false;
num=0;
i=j;
for(int inde=0;inde<length-j;inde++,i++)
{
num+=a[i][length-1-inde];
}
if(num>1)
return false;
num = 0;
j++;
}
return true;
}
/* static void SetA(int[][] a) {
for (int i = 0, j = 0; i < a.length; j++) {
a[i][j] = 0;
if (j == a[i].length - 1) {
j = -1;
i++;
}
}
}*/
//输出内容
static void DrowA(int[][] a) {
for (int i = 0, j = 0; i < a.length; j++) {
System.out.print(a[i][j] + " ");
if (j == a[i].length - 1) {
j = -1;
i++;
System.out.println();
}
}
}
}