新手求助八皇后问题!
老师要求写八皇后的动态演示。现在已经做出了棋盘还有八皇后的代码,但是怎样在棋盘上实现八皇后???
[最优解释]
把当前棋盘上皇后的状态保存在一个数组里。
每走一步,就调用JPanel.repaint()方法更新显示棋盘。
在JPanel.paintComponent里读取皇后状态的数组显示他们。
[其他解释]
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)