八皇后问题实验报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

软件工程上机报告

实验名称:八皇后问题图形界面求解

姓名:郭恂

学号:2011011435

班级:11级数学班

中国石油大学(北京)计算机科学与技术系

一、试验程序截图:

点击显示下一组解即可显示下一组解:

同样的,如果点击上一组解即可显示上一组解。

若在第1组解时点击显示上一组解会弹出报错提示框。

同样,若在第92组解点击显示下一组解也会弹出报错提示框:

二、程序代码

程序使用Java语言编写,编写环境为jdk1.6.0_18。使用编程开发环境eclipse.exe编写。

本程序创建了两个类,两个类在同一个工程中。其中Queen类的作用仅仅用来保存八皇后问题计算结果的数据,便于画图时使用。

本程序大概由两部分组成,第一部分是解八皇后问题,第二部分是画图。

程序源代码为:

类1:

public class Queen

{

public int[] x=new int[8];

public int[] y=new int[8];

public String name;

}

类2:

import javax.swing.*;

import java.awt.event.*;

import java.awt.*;

import javax.swing.JOptionPane;

public class bahuanghou extends JFrame implements ActionListener {

//JLabel[] l;

int number=0; //当前显示的解的编号

int sum=0; //所有解得数量

JLabel l2;

JButton b1,b2; //b1为显示下一组解得按钮,b2为显示上一组解得按钮。

Queen[] q=new Queen[128]; //得到的解储存在Queen类的数组里面。

private Image bomb1=

Toolkit.getDefaultToolkit().getImage("D:\\qizi1.JPG"); //黑格棋子为bomb1

private Image bomb2=

Toolkit.getDefaultToolkit().getImage("D:\\qizi2.JPG"); //白格棋子为bomb2

public bahuanghou() //构造方法,初始化窗口。

{

Queen(); //调用Queen函数解八皇后问题。

this.setBounds(400, 200, 500, 500); //设置窗体大小为(500,500),起始位置为(400,200)

this.setVisible(true); //设置窗体可视为true

this.setDefaultCloseOperation(EXIT_ON_CLOSE); //设置窗体右上角的功能

this.setLayout(new BorderLayout()); //窗体采用边布局

//北部

l2=new JLabel("八皇后问题共有"+(sum)+"组解,当前为第"+(number+1)+"组解");

this.add(l2,"North");

//中部

//中部用paint函数来画八皇后问题的解。

//南部

JPanel p2=new JPanel(); //南部使用一个流布局的panel。

p2.setLayout(new FlowLayout());

this.add(p2,"South");

b2=new JButton("显示上一组解");

b2.addActionListener(this); //按钮注册事件监听器

p2.add(b2);

b1=new JButton("显示下一组解");

b1.addActionListener(this); //按钮注册事件监听器

p2.add(b1);

}

//解八皇后问题的函数

public void Queen()

{

int num=0; //记录解得数量。与类成员sum作用相同,只不过sum保存在类中,num用于给Queen的数组赋值。

int n=8; //皇后上限为8

int[] x=new int[9]; //原本应该是长度为8的数组,这里为了后续计算方便,采用长度为9的数组,其中x[0]=0时不占任何内容的。x[1]为第一行的皇后棋子。

x[0]=x[1]=0; //x[i]代表第i行的皇后,x[i]的值代表该皇后所在的列数。

int k=1;

while(k > 0)

{

x[k]+=1; //转到下一行

while (x[k]<=n && this.Place(k,x)==false)

{

//如果无解,最后一个皇后就会安排到格子外面去

x[k]+=1;

}

if(x[k]<=n)

{

//第k个皇后仍被放置在格子内,有解

if(k==n)

{

this.q[num]=new Queen(); //开拓保存解得空间

for(int i=0;i

{

q[num].x[i]=i; //第i个皇后所在的行数为i

q[num].y[i]=x[i+1]-1; //第i个皇后所在的列数为

x[i+1]-1

}

num++;

sum++;

}

else

{

k++;

x[k]=0; //转到下一行

}

}

else

//第k个皇后已经被放置到格子外了,没解,回溯

k--; //回溯

}

}

boolean Place(int k,int[] x) //判断第k个皇后能否放在第x[k]列上。

{

int i = 1;

while( i < k)

{

if( x[i]==x[k] || (Math.abs(x[i]-x[k]) == Math.abs(i-k)) ) //x[i]==x[k]用来判断第K个是否与之前的皇后在同一列。(Math.abs(x[i]-x[k]) == Math.abs(i-k))用来判断第k个皇后是否与之前的皇后在同一条斜线上。

return false;

i++;

}

return true;

}

public void paint(Graphics g)

相关文档
最新文档