新手求助八皇后问题! 老师要求写八皇后的动态演示。现在已经做出了棋盘还有八皇后的代码,但是怎样在棋盘上实现八皇后??? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 把当前棋盘上皇后的状态保存在一个数组里。每走一步,就调用JPanel.repaint()方法更新显示棋盘。在JPanel.paintComponent里读取皇后状态的数组显示他们。 import java.awt.Color;import javax.swing.*;import java.awt.*;import java.awt.event.*;public class Chess extends JPanel{// 继承面板类 public Chess(int grids,int gridsize) {//grids:行数和列数, gridsize:单元格的高和宽 super(null); for(int i=0; i<grids; i++) { for(int j=0; j<grids; j++) { JLabel l = new JLabel();//生成标签实例 l.setSize(gridsize,gridsize); l.setLocation(i*gridsize,j*gridsize); l.setBorder(BorderFactory.createLineBorder(Color.black)); //设置边界为黑色 add(l);//将l标签添加到面板 } } }public static void main(String[] args) { JFrame f = new JFrame(); f.setSize(658,677); //边框的长和宽 f.setLocationRelativeTo(null); //设置窗口相对于指定组件的位置 f.add(new Chess(8,80)); f.setVisible(true); }}这是棋盘代码,具体要从哪里入手? import java.awt.*;import java.awt.event.*;import javax.swing.*;public class EightQueen { public static int num=1; public void Queen(int queenNum) { String queenLocation[][]=new String[queenNum][queenNum]; //init(queenLocation); System.out.println("总的解决方案如下:"); int c[]=new int[queenNum]; advance(0, queenNum, c, queenLocation); } private void advance(int k,int queenNum ,int c[],String queenLocation[][]) { for(int col=0;col<queenNum;col++) { c[k]=col; if(isSafe(c, k)) { if(k==queenNum-1) { init(queenLocation); for(int i=0;i<queenNum;i++)//填充棋盘 { queenLocation[i][c[i]]="*"; } printQueen(queenLocation, num++);//打印出当前的可行方案 }else { advance(k+1,queenNum,c,queenLocation); } } } } private boolean isSafe(int c[],int currentQueenNum) { //当前是第几个皇后,当前和皇后依次和前面的皇后比较 //currentQueenNum表示当前是第几个皇后 if(currentQueenNum==0) return true; else { for(int i=0;i<currentQueenNum;i++) { if(c[i]==c[currentQueenNum]||(c[i]-c[currentQueenNum])==(i-currentQueenNum)||(c[i]-c[currentQueenNum])==(currentQueenNum-i)) return false; } return true; } } private void init(String [][]queenLocation) { int n=queenLocation.length; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { queenLocation[i][j]="-"; } } } private void printQueen(String [][]queenLocation ,int num) { int n=queenLocation.length; String queenString=""; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(j==(n-1)){ queenString+=queenLocation[i][j]+"\n"; } else{ queenString+=queenLocation[i][j]+" "; } } } System.out.println("第"+num+"种解决方案:"); System.out.println(queenString); } public static void main(String []args) { EightQueen queen=new EightQueen(); int queenNumber=8;//皇后数量 queen.Queen(queenNumber); System.out.println("总共有"+(num-1)+"种解决方案"); }}这是八皇后的代码 在你的代码上作了些不必要的修改package com.tur.demo;import javax.swing.*;import java.awt.*;public class EightQueen { public static int num = 0; private QueenShower queenShower = null; public void Queen(int queenNum) { // 因为每行只有一个皇后,所以用一维数组存储皇后状态,元素值为皇后在这一行的列值 int c[] = new int[queenNum]; advance(0, queenNum, c); } private void advance(int k, int queenNum, int c[]) { for (int col = 0; col < queenNum; col++) { c[k] = col; if (isSafe(c, k)) { // 调用JPanel.repaint()显示 if (queenShower != null) queenShower.showQueen(c, k); if (k == queenNum - 1) { num++; printQueen(c);//打印出当前的可行方案 } else { advance(k + 1, queenNum, c); } } } } private boolean isSafe(int c[], int currentQueenNum) { //当前是第几个皇后,当前和皇后依次和前面的皇后比较 //currentQueenNum表示当前是第几个皇后 for (int i = 0; i < currentQueenNum; i++) { // 方阵中的对角线性质:(a, b) 的下面的对角是 (a + n, b + n)或者(a -n, b + n) if (c[i] == c[currentQueenNum] || (c[i] - c[currentQueenNum]) == (i - currentQueenNum) || (c[i] - c[currentQueenNum]) == (currentQueenNum - i)) return false; } return true; } /** * 对棋盘的初始化 * * @param queenLocation */ private void initQueenLocation(char[][] queenLocation) { int n = queenLocation.length; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { queenLocation[i][j] = '-'; } } } /** * 打印棋盘 */ private void printQueen(int[] status) { char queenLocation[][] = new char[status.length][status.length]; //填充棋盘 initQueenLocation(queenLocation); for (int i = 0; i < status.length; i++) { queenLocation[i][status[i]] = '*'; } int n = status.length; StringBuilder queenString = new StringBuilder(); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { queenString.append(queenLocation[i][j]); if (j == (n - 1)) { queenString.append("\n"); } else { queenString.append(" "); } } } System.out.println("第" + num + "种解决方案:"); System.out.println(queenString); } public void setQueenShower(QueenShower queenShower) { this.queenShower = queenShower; } public static void main(String[] args) { QueenShower shower = new QueenShower(); shower.setDelay(10); // 设置动画暂停时间 shower.setDelayOfEnd(3000); // 设置显示窗口 JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(500, 500); frame.setLocationRelativeTo(null); frame.getContentPane().add(shower); frame.setVisible(true); // 创建EightQueen EightQueen queen = new EightQueen(); queen.setQueenShower(shower); int queenNumber = 8;//皇后数量 queen.Queen(queenNumber); System.out.println("总共有" + num + "种解决方案,呵呵,效果还不错吧O(∩_∩)O"); }}/** * 用来显示皇后状态的Panel */class QueenShower extends JPanel { private int currentRow = 0; // 当前是第几行 private int[] status = null; // 皇后状态数组 private int delay = 100; // 动画暂停时间 private int delayOfEnd = 5000; // 找到解决方暂停的时间,停久点可以方便看到解决方案 public QueenShower() { } public int getDelay() { return delay; } public void setDelay(int delay) { this.delay = delay; } public int getDelayOfEnd() { return delayOfEnd; } public void setDelayOfEnd(int delayOfEnd) { this.delayOfEnd = delayOfEnd; } public void showQueen(int[] status, int currentRow) { this.status = status; this.currentRow = currentRow; this.repaint(); try { // 找到解决方案的时候,多停一会 Thread.sleep((currentRow == status.length - 1) ? delayOfEnd : delay); } catch (InterruptedException e) { } } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); // 使用Swing自带的双缓冲清除上一帧的痕迹 if (status == null) { return; } int x = 0, y = 0; int offsetX = 2, offsetY = 2; // gaps between the frame Dimension size = getSize(); int cellWidth = (size.width - offsetX - offsetX) / status.length; int cellHeight = (size.height - offsetY - offsetY) / status.length; // Draw row grid lines int width = status.length * cellWidth; for (int i = 0; i <= status.length; ++i) { g.drawLine(0 + offsetX, y + offsetY, width + offsetX, y + offsetY); y += cellHeight; } // Draw column grid lines int height = status.length * cellHeight; for (int i = 0; i <= status.length; ++i) { g.drawLine(x + offsetX, offsetY, x + offsetX, height + offsetY); x += cellWidth; } // Draw queens for (int i = 0; i <= currentRow; ++i) { x = status[i] * cellWidth; y = i * cellHeight; g.fillRect(x + offsetX, y + offsetY, cellWidth, cellHeight); } }} http://bbs.csdn.net/topics/39029808880分的 算法题 关于java连接数据库的问题 菜鸟问题:如何以二进制格式读入*.data文件? 请教高手大大门,来帮我看看我该怎么改啊!!在线等 几个非常基础的问题 msword文件读写问题 又见倒分贴 在JAVA程序中,如何使用Windows的API 请问如何在oracle数据库中存取图片? 各位,请问去面试JAVA程序员,需要什么条件,还有面试时有什么技巧? 有没有报表自动生成工具for java的,如VB的seagate crystal Reports? 求高人指教,java中关于序列化和反序列化的问题 关于JLabel的setText在监听器中不刷新问题
每走一步,就调用JPanel.repaint()方法更新显示棋盘。
在JPanel.paintComponent里读取皇后状态的数组显示他们。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;public class Chess extends JPanel
{// 继承面板类
public Chess(int grids,int gridsize)
{//grids:行数和列数, gridsize:单元格的高和宽
super(null);
for(int i=0; i<grids; i++)
{
for(int j=0; j<grids; j++)
{
JLabel l = new JLabel();//生成标签实例
l.setSize(gridsize,gridsize);
l.setLocation(i*gridsize,j*gridsize);
l.setBorder(BorderFactory.createLineBorder(Color.black)); //设置边界为黑色
add(l);//将l标签添加到面板
}
}
}public static void main(String[] args)
{
JFrame f = new JFrame();
f.setSize(658,677); //边框的长和宽
f.setLocationRelativeTo(null); //设置窗口相对于指定组件的位置
f.add(new Chess(8,80));
f.setVisible(true);
}
}
这是棋盘代码,具体要从哪里入手?
import java.awt.event.*;
import javax.swing.*;public class EightQueen {
public static int num=1;
public void Queen(int queenNum)
{
String queenLocation[][]=new String[queenNum][queenNum];
//init(queenLocation);
System.out.println("总的解决方案如下:");
int c[]=new int[queenNum];
advance(0, queenNum, c, queenLocation);
}
private void advance(int k,int queenNum ,int c[],String queenLocation[][])
{
for(int col=0;col<queenNum;col++)
{
c[k]=col;
if(isSafe(c, k))
{
if(k==queenNum-1)
{
init(queenLocation);
for(int i=0;i<queenNum;i++)//填充棋盘
{
queenLocation[i][c[i]]="*";
}
printQueen(queenLocation, num++);//打印出当前的可行方案
}else
{
advance(k+1,queenNum,c,queenLocation);
}
}
}
}
private boolean isSafe(int c[],int currentQueenNum)
{
//当前是第几个皇后,当前和皇后依次和前面的皇后比较
//currentQueenNum表示当前是第几个皇后
if(currentQueenNum==0)
return true;
else
{
for(int i=0;i<currentQueenNum;i++)
{
if(c[i]==c[currentQueenNum]||(c[i]-c[currentQueenNum])==(i-currentQueenNum)||(c[i]-c[currentQueenNum])==(currentQueenNum-i))
return false;
}
return true;
}
}
private void init(String [][]queenLocation)
{
int n=queenLocation.length;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
queenLocation[i][j]="-";
}
}
}
private void printQueen(String [][]queenLocation ,int num)
{
int n=queenLocation.length;
String queenString="";
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(j==(n-1)){
queenString+=queenLocation[i][j]+"\n";
}
else{
queenString+=queenLocation[i][j]+" ";
}
}
}
System.out.println("第"+num+"种解决方案:");
System.out.println(queenString);
}
public static void main(String []args)
{
EightQueen queen=new EightQueen();
int queenNumber=8;//皇后数量
queen.Queen(queenNumber);
System.out.println("总共有"+(num-1)+"种解决方案");
}
}这是八皇后的代码
package com.tur.demo;import javax.swing.*;
import java.awt.*;public class EightQueen {
public static int num = 0;
private QueenShower queenShower = null; public void Queen(int queenNum) {
// 因为每行只有一个皇后,所以用一维数组存储皇后状态,元素值为皇后在这一行的列值
int c[] = new int[queenNum];
advance(0, queenNum, c);
} private void advance(int k, int queenNum, int c[]) {
for (int col = 0; col < queenNum; col++) {
c[k] = col;
if (isSafe(c, k)) {
// 调用JPanel.repaint()显示
if (queenShower != null) queenShower.showQueen(c, k); if (k == queenNum - 1) {
num++;
printQueen(c);//打印出当前的可行方案
} else {
advance(k + 1, queenNum, c);
}
}
}
} private boolean isSafe(int c[], int currentQueenNum) {
//当前是第几个皇后,当前和皇后依次和前面的皇后比较
//currentQueenNum表示当前是第几个皇后
for (int i = 0; i < currentQueenNum; i++) {
// 方阵中的对角线性质:(a, b) 的下面的对角是 (a + n, b + n)或者(a -n, b + n)
if (c[i] == c[currentQueenNum]
|| (c[i] - c[currentQueenNum]) == (i - currentQueenNum)
|| (c[i] - c[currentQueenNum]) == (currentQueenNum - i))
return false;
}
return true;
}
/**
* 对棋盘的初始化
*
* @param queenLocation
*/
private void initQueenLocation(char[][] queenLocation) {
int n = queenLocation.length; for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
queenLocation[i][j] = '-';
}
}
} /**
* 打印棋盘
*/
private void printQueen(int[] status) {
char queenLocation[][] = new char[status.length][status.length]; //填充棋盘
initQueenLocation(queenLocation);
for (int i = 0; i < status.length; i++) {
queenLocation[i][status[i]] = '*';
} int n = status.length;
StringBuilder queenString = new StringBuilder();
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
queenString.append(queenLocation[i][j]); if (j == (n - 1)) {
queenString.append("\n");
} else {
queenString.append(" ");
}
}
} System.out.println("第" + num + "种解决方案:");
System.out.println(queenString);
} public void setQueenShower(QueenShower queenShower) {
this.queenShower = queenShower;
} public static void main(String[] args) {
QueenShower shower = new QueenShower();
shower.setDelay(10); // 设置动画暂停时间
shower.setDelayOfEnd(3000); // 设置显示窗口
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 500);
frame.setLocationRelativeTo(null);
frame.getContentPane().add(shower);
frame.setVisible(true); // 创建EightQueen
EightQueen queen = new EightQueen();
queen.setQueenShower(shower);
int queenNumber = 8;//皇后数量
queen.Queen(queenNumber);
System.out.println("总共有" + num + "种解决方案,呵呵,效果还不错吧O(∩_∩)O");
}
}/**
* 用来显示皇后状态的Panel
*/
class QueenShower extends JPanel {
private int currentRow = 0; // 当前是第几行
private int[] status = null; // 皇后状态数组
private int delay = 100; // 动画暂停时间
private int delayOfEnd = 5000; // 找到解决方暂停的时间,停久点可以方便看到解决方案 public QueenShower() {
} public int getDelay() {
return delay;
} public void setDelay(int delay) {
this.delay = delay;
} public int getDelayOfEnd() {
return delayOfEnd;
} public void setDelayOfEnd(int delayOfEnd) {
this.delayOfEnd = delayOfEnd;
} public void showQueen(int[] status, int currentRow) {
this.status = status;
this.currentRow = currentRow;
this.repaint(); try {
// 找到解决方案的时候,多停一会
Thread.sleep((currentRow == status.length - 1) ? delayOfEnd : delay);
} catch (InterruptedException e) {
}
} @Override
protected void paintComponent(Graphics g) {
super.paintComponent(g); // 使用Swing自带的双缓冲清除上一帧的痕迹 if (status == null) { return; } int x = 0, y = 0;
int offsetX = 2, offsetY = 2; // gaps between the frame
Dimension size = getSize();
int cellWidth = (size.width - offsetX - offsetX) / status.length;
int cellHeight = (size.height - offsetY - offsetY) / status.length; // Draw row grid lines
int width = status.length * cellWidth;
for (int i = 0; i <= status.length; ++i) {
g.drawLine(0 + offsetX, y + offsetY, width + offsetX, y + offsetY);
y += cellHeight;
} // Draw column grid lines
int height = status.length * cellHeight;
for (int i = 0; i <= status.length; ++i) {
g.drawLine(x + offsetX, offsetY, x + offsetX, height + offsetY);
x += cellWidth;
} // Draw queens
for (int i = 0; i <= currentRow; ++i) {
x = status[i] * cellWidth;
y = i * cellHeight; g.fillRect(x + offsetX, y + offsetY, cellWidth, cellHeight);
}
}
}
80分的 算法题