八皇后问题

来源:互联网 发布:java中import的用法 编辑:程序博客网 时间:2024/05/18 02:34
/*八皇后问题* 描述:在一个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 elsereturn 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}


0 0
原创粉丝点击