这就是著名的八皇后问题。八个皇后在排列时不能同在一行、一列或一条斜
线上。在8!=40320种排列中共有92种解决方案。
class EightQueen
{
static final int MAXSIZE = 8;//棋盘大小
static int okTimes = 0; //解法个数
static int[][] chess = new int[MAXSIZE][MAXSIZE];//棋盘
public static boolean CanPut(int row,int col)
{//皇后能否放置在chess[row][col]的位置上
//第row行不能有多于1个皇后
int i,j;
for(i=0;i<MAXSIZE;++i)
{
if(chess[row][i]==1)
return false;
}
//第col列不能有多于1个皇后
for(i=0;i<MAXSIZE;++i)
{
if(chess[i][col]==1)
return false;
}
//对角线不能有多于1个皇后
//反对角线
for(i=row-1,j=col+1;i>=0&&j<MAXSIZE;--i,++j)
{
if(chess[i][j]==1)
return false;
}
for(i=row+1,j=col-1;i<MAXSIZE&&j>=0;++i,--j)
{
if(chess[i][j]==1)
return false;
}
//对角线
for(i=row-1,j=col-1;i>=0&&j>=0;--i,--j)
{
if(chess[i][j]==1)
return false;
}
for(i=row+1,j=col+1;i<MAXSIZE&&j<MAXSIZE;++i,++j)
{
if(chess[i][j]==1)
return false;
}
return true;
}
public static void Solve(int curChess,int num)
{
if(num==8)
{//八个皇后了,
okTimes++;
return;
}
else
{
if(curChess<64)
{
int i,j;
i=curChess/MAXSIZE;//行
j=curChess%MAXSIZE;//列
if(chess[i][j]==0&&CanPut(i,j)==true)
{//chesss[i][j]空着,并且经测试可以放置
chess[i][j]=1; //放置皇后下去
Solve(curChess+1,num+1);
chess[i][j]=0; //回溯
}
Solve(curChess+1,num); //chess[i][j]无法放置,跳过它
}
}
}
public static void main(String args[])
{
int i,j;
for(i=0;i<MAXSIZE;++i)
for(j=0;j<MAXSIZE;++j)
{
chess[i][j] = 0;
}
Solve(0,0);
System.out.println("八皇后问题共有"+okTimes+"个解法");
}
}
class Queen8{
static final int QueenMax = 8;
static int oktimes = 0;
static int chess[] = new int[QueenMax];//每一个Queen的放置位置
public static void main(String args[]){
for (int i=0;i<QueenMax;i++)chess[i]=-1;
placequeen(0);
System.out.println("\n\n\n八皇后共有"+oktimes+"个解法 made by yifi 2003");
}
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");
for (i=0;i<QueenMax;i++){
String row="第"+(i+1)+"行: ";
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++;}
System.out.println(row);
}
}
}
//历遍完成就停止
}
}
分享到:
相关推荐
八皇后问题是一个经典的计算机编程问题,它涉及到回溯算法、数据结构和图形用户界面的设计。在C++中,特别是结合MFC(Microsoft Foundation Classes)框架,可以创建具有用户友好界面的程序来解决此问题。 首先,...
### 八皇后问题详解 #### 一、八皇后问题背景 八皇后问题是一个经典的计算机科学问题,也是数学领域中一个有趣的挑战。这个问题来源于国际象棋的背景:如何在一个8×8的国际象棋棋盘上放置八个皇后,使得没有任何...
它们被应用于解决各种复杂问题,包括经典的八皇后问题。八皇后问题是一个著名的棋盘放置问题,要求在8×8的棋盘上摆放8个皇后,使得任意两个皇后都不能在同一行、同一列或同一对角线上。下面将详细解释这些方法以及...
八皇后问题 c++ 八皇后问题 c++ 八皇后问题 c++
用回溯求解法求解八皇后问题,经典问题matlab实现,欢迎大家下载
数据结构八皇后问题实验报告是一份详尽的项目文档,主要涵盖了八皇后问题的解决方案,该问题是一个经典的计算机科学和算法问题,源自国际象棋。报告的作者花费了两周时间完成,显然投入了大量的精力和思考。 八皇后...
八皇后问题课程设计论文
解决八皇后问题的源码,带有注释,由于数据结构即算法的学习,如有其他需要,请留言
作业代码,汇编写八皇后问题,自己写了一份,在网上找的也在里面
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或...