class a{
static final int QueenMax = 8;
static int oktimes = 0;
static int chess[] = new int[QueenMax];//每一个Queen的放置位置
public static void main(String[] args) {
for (int i=0;i<QueenMax;i++)chess=-1;
placequeen(0);
System.out.println("\n\n\n八皇后共有"+oktimes+"个解法 made by yifi 2003");
}
public static void placequeen(int num){ //num 为现在要放置的行数
int i=0;
boolean qsave[] = new boolean[QueenMax];
for(;i<QueenMax;i++) qsave=true;
//下面先把安全位数组完成
i=0;//i 是现在要检查的数组值
while (i<num){
qsave[chess]=false;
int k=num-i;
if ( (chess+k >= 0) && (chess+k < QueenMax) ) qsave[chess+k]=false;
if ( (chess-k >= 0) && (chess-k < QueenMax) ) qsave[chess-k]=false;
i++;
}
//下面历遍安全位
for(i=0;i<QueenMax;i++){
if (qsave==false)continue;
if (num<QueenMax-1){
chess[num]=i;
placequeen(num+1);
}
else{ //num is last one
chess[num]=i;
oktimes++;
System.out.println("这是第"+oktimes+"个解法 如下:");
System.out.println("第n行: 1 2 3 4 5 6 7 8");
for (i=0;i<QueenMax;i++){
String row="第"+(i+1)+"行: ";
if (chess==0);
else
for(int j=0;j<chess;j++) row+="--";
row+="++";
int j = chess;
while(j<QueenMax-1){row+="--";j++;}
System.out.println(row);
}
}
}
//历遍完成就停止
}
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在您的代码中,您尝试实现经典的八皇后问题,通过递归方法放置皇后以找出所有合法的摆放方式。根据提供的代码片段,我注意到一些需要调整的地方以确保程序能正确执行并找到所有解法。
class EightQueens {
static final int QueenMax = 8;
static int oktimes = 0;
static int chess[] = new int[QueenMax]; // 每一个皇后的放置列位置
public static void main(String[] args) {
placequeen(0);
System.out.println("\n\n\n八皇后共有" + oktimes + "个解法 made by yifi 2003");
}
public static boolean isSafe(int row, int col) { // 检查当前位置是否安全
for (int i = 0; i < row; i++) {
if (chess[i] == col || Math.abs(chess[i] - col) == row - i)
return false;
}
return true;
}
public static void placequeen(int num) { // num 为现在要放置的行数
if (num == QueenMax) { // 所有皇后已放置,打印解法并增加计数
++oktimes;
printSolution();
return;
}
for (int i = 0; i < QueenMax; i++) {
if (isSafe(num, i)) { // 如果当前位置安全
chess[num] = i; // 放置皇后
placequeen(num + 1); // 递归尝试下一行
}
}
}
public static void printSolution() {
for (int row = 0; row < QueenMax; row++) {
for (int col = 0; col < QueenMax; col++) {
if (chess[row] == col)
System.out.print("Q ");
else
System.out.print("* ");
}
System.out.println();
}
System.out.println();
}
}
i=-1
作为起始值,并且缺少对递归结束条件的直接处理。此外,检查皇后之间是否冲突的逻辑未明确实现。解决方案:
i=-1
更正为合理的初始值,这里直接在placequeen
方法中使用递归逻辑来遍历每一列。isSafe
方法,用于判断当前行和列的位置是否可以放置皇后,避免同行、同列及对角线冲突。printSolution
打印解法并增加解法计数器oktimes
。注意事项:
此修改后的代码应该能够正确解决八皇后问题,输出所有可能的解法数量以及具体的摆放布局。