请编程求解八皇后问题。要求在8×8的棋盘上放置8个皇后(每个皇后只能占用一个格子)使得在每行、每列以及每条与对角线平行的斜线上分别至多只有一个皇后。要求输出所有的可能解。下面是其中的一个解,以供参考。
+-+-+-+-+-+-+-+-+
|Q| | | | | | | |
+-+-+-+-+-+-+-+-+
| | | | |Q| | | |
+-+-+-+-+-+-+-+-+
| | | | | | | |Q|
+-+-+-+-+-+-+-+-+
| | | | | |Q| | |
+-+-+-+-+-+-+-+-+
| | |Q| | | | | |
+-+-+-+-+-+-+-+-+
| | | | | | |Q | |
+-+-+-+-+-+-+-+-+
| |Q| | | | | | |
+-+-+-+-+-+-+-+-+
| | | |Q| | | | |
+-+-+-+-+-+-+-+-+
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package l_queen;
/**
*
* @author Administrator
*/
public class L_Queen {
/**
* @param args the command line arguments
*/
public static int NUMBER=8;
char [][]s_queen;
L_Queen()
{
s_queen=new char[NUMBER][NUMBER];
}//L_Queen构造方法结束
//输出框图的格的线行
private void sq_oututQueenRowBoard()
{
for(int i=0;i<NUMBER;i++)
{
System.out.print("+");
System.out.print("-");
}
System.out.println("+");
}//sq_oututQueenRowBoard结束
//输出框图的格的据行
private void sq_oututQueenRowBoard(int i)
{
for(int j=0;j<s_queen[i].length;j++)
System.out.print("|"+s_queen[i][j]);
System.out.println("|");
}//sq_oututQueenRowBoard结束
//输出框图
public void sq_outputQueen()
{
sq_oututQueenRowBoard();
for(int i=0;i<s_queen.length;i++)
{
sq_oututQueenRowBoard(i);
sq_oututQueenRowBoard();
}
}//sq_outputQreen结束
//初始化数据
private void sq_dataInit()
{
int i=0;
int j=0;
for(;j<s_queen.length;j++)
s_queen[j][i]='Q';
for(i=0;i<s_queen.length;i++)
for(j=1;j<s_queen[i].length;j++)
s_queen[i][j]=' ';
}//sq_dataInit结束
//数据结束检测
//返回值说明:当数据为最后一个数据时,返回teue,否则,返回false
private boolean sq_dataEnd()
{
int i=0;
int j=NUMBER-1-i;
for(;i<NUMBER-1;i++,j--)
if(s_queen[i][j]!='Q')
return (false);
return (true);
}//sq_dataEnd结束
//取下一个数据
private void sq_dataNext()
{
for(int i=NUMBER-1;i>=0;i--)
for(int j=0;j<s_queen[i].length;j++)
if(s_queen[i][j]==' ')
continue;
else if(s_queen[i][NUMBER-1]=='Q')
{
s_queen[i][NUMBER-1]=' ';
s_queen[i][0]='Q';
break;
}
else
{
s_queen[i][j]=' ';
s_queen[i][j+1]='Q';
return;
}
}//sq_dataNext结束
//数据检测:各列是否有多于一个的皇后
private boolean sq_dataCheckSumColumn()
{
int k=0;
for(int i=0;i<s_queen.length;i++)
{
for(int j=0;j<s_queen.length;j++)
if(s_queen[j][i]=='Q'&&k<=1)
k++;
if(k>1)
return(false);
else k=0;
}
return(true);
}//sq_dataCheckSumColumn结束
private boolean sq_dataCheck()
{
int l=0;
int k=0;
int m=0;
if(!sq_dataCheckSumColumn())
return(false);
//判断正对角线及其平行的斜线是否多于一个皇后
for(int i=0;i<s_queen.length;i++)
for(int j=0;j<s_queen[i].length;j++)
{
k=0;
for(l=i,m=j;m<=NUMBER-1&&l<=NUMBER-1;m++,l++)
{
if(s_queen[l][m]=='Q'&&k<=1)
k++;
if(k==2)
return (false);
}
}
//判断反对角线及其平行的斜线是否多于一个皇后
for(int i=0;i<s_queen.length;i++)//判断反对角线
for(int j=NUMBER-1;j>=0;j--)
{
k=0;
for(l=i,m=j;m>=0&&l<=NUMBER-1;m--,l++)
{
if(s_queen[l][m]=='Q'&&k<=1)
k++;
if(k==2)
return (false);
}
}
return(true);
}//sq_dataCheck结束
//求解并输出八皇后问题
public void sq_arrange()
{
int n=1;
for(sq_dataInit();!sq_dataEnd();sq_dataNext())
{
if(sq_dataCheck())
{
System.out.println("第"+n+"个结果是:");
sq_outputQueen();
n++;
}
}
}//sq_arrange结束
public static void main(String[] args) {
// TODO code application logic here
L_Queen q=new L_Queen();
q.sq_arrange();
}//main结束
}//类L_Queen结束