八皇后问题图形版.doc
文本预览下载声明
八皇后问题图形版://8 Queen 递归算法
//如果有一个Q 为 chess[i]=j;
//则不安全的地方是 k行 j位置,j+k-i位置,j-k+i位置
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.net.*;
public class Queen2{
//定义皇后的个数QueenMax,算法的种类oktiemes
static final int QueenMax = 8;
static int oktimes = 0;
static int chess[] = new int[QueenMax];//每一个Queen的放置位置
public static String []rows=new String[92];//保存算法的字符串
public static void main(String args[])
{
for (int i=0;i QueenMax;i++)
chess[i]=-1;
placequeen(0);
QueenTu queen=new QueenTu();
System.out.println(\n八皇后共有+oktimes+个解法. 作者:孟雪锋、张锐 版本:1.0);
}
/*
*@功能就是获得每一种方法的字符串,保存在rows数组中,用的是递归方法
*/
public static void placequeen(int num)
{ //num 为现在要放置的行数
int i=0;
boolean qsave[] = new boolean[QueenMax];
for(;i QueenMax;i++)
qsave[i]=true;
i=0;
//下面先把安全位数组完成
//i 是现在要检查的数组值
while (i num)
{
qsave[chess[i]]=false;
int k=num-i;
if ( (chess[i]+k = 0) (chess[i]+k QueenMax) )
qsave[chess[i]+k]=false;
if ( (chess[i]-k = 0) (chess[i]-k QueenMax) )
qsave[chess[i]-k]=false;
i++;
}
//下面历遍安全位
for(i=0;i QueenMax;i++)
{
if (qsave[i]==false)
continue;
if (num QueenMax-1)
{
chess[num]=i;
placequeen(num+1);
}
else
{ //num is last one
chess[num]=i;
oktimes++;
//System.out.println(这是第+oktimes+个解法 如下:);
//System.out.println(第n行: 1 2 3 4 5 6 7 8);
String row=;
for (i=0;i QueenMax;i++)
{
if (chess[i]==0);
else
for(int j=0;j chess[i];j++) row+=-;
row+=+;
int j = chess[i];
while(j QueenMax-1)
{
row+=-;
j++;
}
rows[oktimes-1]=row;
}
}
}
//历遍完成就停止
}
}
//用swing组件显示
class QueenTu extends JFrame
{
JLabel lab1=new JLab
显示全部