public class MainFrame {
final static int N = 16;
static int list[][] = new int[N][N];
int step[] = new int[N];
public void Print()
{
for(int i=0; i<N; i++)
{
for(int j=0; j<N; j++)
System.out.print(list[i][j]+" ");
System.out.println();
}
}
public void NQuene()
{
for(int i=0; i<N; i++)
{
int j=0;
while(j<N)
{
if ( ValidateLocate(i,j,list) )
{
list[i][j] = 1;
step[i] = j;
break;
}
j++;
if( j==N )
{
i--;
j=step[i]+1;
for(int k=0; k<N; k++)
list[i][k]=0;
if(j==N)
{
i--;
j=step[i]+1;
for(int k=0; k<N; k++)
list[i][k]=0;
}
}
}
}
}
public static boolean ValidateLocate(int i, int j, int[][] l)
{
for(int m=0; m<N; m++)
{
if( list[m][j] == 1 )
return false;
}
for(int m=0; m<N; m++)
for(int n=0; n<N; n++)
{
if(list[m][n]==1)
{
if(Math.abs(i-m) == Math.abs(j-n))
return false;
}
}
return true;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
MainFrame mf = new MainFrame();
mf.NQuene();
mf.Print();
}
}默认N=16,打印结果如下所示:
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
本文介绍了一个使用Java实现的N皇后问题解决方案。该程序通过递归回溯算法找到所有可行的棋盘配置,使得N个皇后互不攻击。程序定义了一个N×N的二维数组来表示棋盘,并通过ValidateLocate方法检查每个皇后的位置是否冲突。
1万+

被折叠的 条评论
为什么被折叠?



