八皇后问题
来源:互联网 发布: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
- 八皇后 n皇后 问题
- 八皇后N皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题(2)
- 八皇后问题(3)
- 八皇后问题
- 八皇后问题程序
- 浅谈八皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题求解
- 八皇后问题
- 八皇后问题
- 八皇后问题
- lightoj 1019
- 查找进程所在路径和启动命令
- 使用gdb调试多线程死锁
- 7.20在学生类student和教师类teacher 基础上再派生出一个助教类
- lightoj 1020 (博弈)
- 八皇后问题
- 【android】查看软件布局神器Hierarchy Viewer
- java构造方法与方法的区别
- cocos2d-x-3.2alpha0 如何创建新工程
- vc6 两个问题记录
- JavaFX文档(12)掌握FXML——4使用FXML来创建自定义控件
- 考研机试真题(一)之排序
- HDU1532 Drainage Ditches(网络流模板)
- Fedora GNOME3提示出现错误无法恢复