18910140161

算法系列之八皇后以及n皇后问题详解

顺晟科技

2021-06-16 10:38:54

212

//八皇后

/*

八个皇后放在一个8*8的棋盘上,不允许两个皇后在棋盘的同一行、列和对角线上。

1)

对于88二维阵列上的点a[i]j,

如果A[s][q]满足| s-I |=| q-j |,则a [s] [q]在a[i][j]的对角线上。

如果s=i,那么a[s][q]在a[i][j]的同一列。

2)

每行只有一个皇后:声明数组皇后[8]存放皇后的位置。//数组Queen [n]的意思是把第n个Queen放在网格的(n,Queen[n])位置

公有静态int judge(int n)//判断职位(n,Queen[n])是否可以担任皇后。

3)

每行只放一个皇后,每一个点都试一遍,这样皇后最后放的位置都可以试出来

*/

公共八等女王{

//定义皇后的数量

static int queen num=8;

static int[]Queen=new int[queenam];

//最终满足条件的次数

静态int count=0;

//写一个回顾,把皇后放在每一行,以便放下一行。

Public static void NQueen(int n)//将皇后放在n行

{

//测试每行的每个位置,放置皇后

for(int I=0;i queennumi ) {

//指定女王的位置

queen[n]=I;

//判断女王是否可以安置

if(judge(n)){

//如果是最后一行,且满足条件,则执行操作总数。

if(n==queennum-1){

show();

system . out . println();

计数;//方法加一

}else {

//否则,把皇后放在下一排

NQueen(n ^ 1);

}

}

}

}

//写一个函数,确定是否可以放置

public static boolean judge(int n)//判断(n,Queen(n))是否可以将queen * n作为行放置。

{

//循环应该结束,因为所有完整的列都应该与上面的所有对角线进行比较

for(int j=0;j n;j ) {

//先判断同一个列,再判断对角线,同行不用判断因为是一行一行放的,只有一个放在没有一行。

if(Queen[j]==Queen[n]| | math . ABS(Queen[j]-Queen[n])==n-j){

返回false

}

}

返回true

}

公共静态无效显示()

{

for(int I=0;iqueennumI)

{

System.out.print('(' i ',' Queen[I]')');

}

}

公共静态void main(String[] args){

NQueen(0);//首先将皇后放在排

System.out.print('有' count '方式');

}

}

测试结果: (共8种)

(0,0)

(1,0)

(2,0)

(3,0)

(4,0)

(5,0)

(6,0)

(7,0)

(0,1)

(1,0)

(2,0)

(3,0)

(4,0)

(5,0)

(6,0)

(7,0)

(0,2)

(1,0)

(2,0)

(3,0)

(4,0)

(5,0)

(6,0)

(7,0)

(0,3)

(1,0)

(2,0)

(3,0)

(4,0)

(5,0)

(6,0)

(7,0)

(0,4)

(1,0)

(2,0)

(3,0)

(4,0)

(5,0)

(6,0)

(7,0)

(0,5)

(1,0)

(2,0)

(3,0)

(4,0)

(5,0)

(6,0)

(7,0)

(0,6)

(1,0)

(2,0)

(3,0)

(4,0)

(5,0)

(6,0)

(7,0)

(0,7)

(1,0)

(2,0)

(3,0)

(4,0)

(5,0)

(6,0)

(7,0)

有8种方法

相关文章
我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航