/*八皇后问题
* 描述:在一个8*8的棋盘格上面放置八个皇后,使得每个皇后不能互相攻击
* 攻击:不能位于同一列,同一行,和对角线上
* 分析:一共有八行八列,则每一行每一列只能有一个皇后
*/
/*
* 判断给定的位置是否安全
* 参数为已经确定的点的数组,和要进行判断的点的行和列坐标
*/
private static boolean safeLocation(int [] queues,int row,int col){
for(int i =0 ; i <col ; i++){
//判断是否会攻击
if( (i == col) || (queues[i] == row) || ( (row+col) ==(i+queues[i]) ) || ( (queues[i]-i) == row-col ) ){
return false;
}
}
return true;
}//end safeLocation
/*
* 八皇后问题算法实现
* 采用回溯的策略来实现,如果递归的过程中遇到错误,则返回上一层递归
* 重新选择上一步的位置
*/
public boolean eightQueue(int[] queues,int col){
int row; //记录行数
boolean foundLocation; //标记递归是否可以得到正确的位置
//结束递归调用条件,如果列数等于8则结束
if(col == 8){
foundLocation = true;
}
else{
row = 0;
foundLocation = false;
//回溯算法如果,递归调用的子调用的结果为false则返回该函数继续判断,
//找到合适的点再次调用递归。
while(row < 8 && foundLocation != true){
if(safeLocation(queues, row, col)){
queues[col] = row;
foundLocation = eightQueue(queues, col+1);
if(!foundLocation){
row++;
}
}
else{
row++;
}
}
}//end else
return foundLocation;
}//end eightQueue
/*
* 测试驱动
* 指定初始的行数
*/
public boolean startEightQueue(int queues[],int row){
//指定第一列的初始行数
queues[0] = row;
if(eightQueue(queues, 1)){
return true;
}
else{
return false;
}
}//end startEightQueue
<pre name="code" class="java">//完整实现
package 算法;
import java.awt.Button;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.Scanner;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import 排序.bubble;
/*八皇后问题
* 描述:在一个8*8的棋盘格上面放置八个皇后,使得每个皇后不能互相攻击
* 攻击:不能位于同一列,同一行,和对角线上
* 分析:一共有八行八列,则每一行每一列只能有一个皇后
*/
public class EightQueue {
/*
* 判断给定的位置是否安全
* 参数为已经确定的点的数组,和要进行判断的点的行和列坐标
*/
private static boolean safeLocation(int [] queues,int row,int col){
for(int i =0 ; i <col ; i++){
//判断是否会攻击
if( (i == col) || (queues[i] == row) || ( (row+col) ==(i+queues[i]) ) || ( (queues[i]-i) == row-col ) ){
return false;
}
}
return true;
}//end safeLocation
/*
* 八皇后问题算法实现
* 采用回溯的策略来实现,如果递归的过程中遇到错误,则返回上一层递归
* 重新选择上一步的位置
*/
public boolean eightQueue(int[] queues,int col){
int row; //记录行数
boolean foundLocation; //标记递归是否可以得到正确的位置
//结束递归调用条件,如果列数等于8则结束
if(col == 8){
foundLocation = true;
}
else{
row = 0;
foundLocation = false;
//回溯算法如果,递归调用的子调用的结果为false则返回该函数继续判断,
//找到合适的点再次调用递归。
while(row < 8 && foundLocation != true){
if(safeLocation(queues, row, col)){
queues[col] = row;
foundLocation = eightQueue(queues, col+1);
if(!foundLocation){
row++;
}
}
else{
row++;
}
}
}//end else
return foundLocation;
}//end eightQueue
/*
* 测试驱动
* 指定初始的行数
*/
public boolean startEightQueue(int queues[],int row){
//指定第一列的初始行数
queues[0] = row;
if(eightQueue(queues, 1)){
return true;
}
else{
return false;
}
}//end startEightQueue
/*
* 在图形界面显示八皇后问题的结果
*/
public void showInPanel(int [] queues){
JFrame frame = new JFrame("八皇后");
GridLayout layout = new GridLayout(8,8,0,2);
frame.setLayout(layout);
ArrayList<Button> button = new ArrayList<Button>();
for(int i = 0 ; i < 64 ;i++){
button.add(new Button(" "));
//frame.add(button.get(i));
}
for(int i =0 ; i < 8; i++){
Button bu = new Button("8");
bu.setBackground(Color.GREEN);
button.set(i+queues[i]*8, bu);
}
for(Button b: button){
frame.add(b);
}
frame.setSize(400, 400);
frame.setVisible(true);
}
/*
*在命令行中显示结果
*/
public void showOnConsole(int [] queues){
int [] [] end = new int[8][8];
for(int i =0 ; i < 8;i++){
end[queues[i]][i] =1;
}
for(int m =0 ; m < 8; m++){
for(int n = 0 ; n< 8 ; n++){
if(end[m][n] != 0){
System.out.print("| 8 ");
break;
}
else{
System.out.print("| 0 ");
}
}
System.out.println(" |");
}
}
public static void main(String[] args) {
int queues[] = new int [8];
EightQueue e = new EightQueue();
Scanner sc = new Scanner(System.in);
System.out.println("请输入起始的行(1~8):");
int col = sc.nextInt();
if(col < 1 ||col >8){
throw new IllegalArgumentException("请输入正确的选项");
}
e.startEightQueue(queues,col-1);
System.out.println("选择显示的方式:1、命令行 2、图形界面 3、1和2:");
int choice = sc.nextInt();
switch(choice){
case 1:
e.showOnConsole(queues);
break;
case 2:
e.showInPanel(queues);
break;
case 3:
e.showOnConsole(queues);
e.showInPanel(queues);
break;
default :
System.err.println("请输入正确的选择:");
break;
}
}//end main
}