开发者社区 问答 正文

八皇后

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);
}
}
}
//历遍完成就停止
}
}

展开
收起
琴瑟 2017-04-07 14:33:18 2860 分享 版权
阿里云 AI 助理回答

在您的代码中,您尝试实现经典的八皇后问题,通过递归方法放置皇后以找出所有合法的摆放方式。根据提供的代码片段,我注意到一些需要调整的地方以确保程序能正确执行并找到所有解法。

修正后的代码示例

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
  • 注意事项

    • 确保递归终止条件准确无误,这里是当放置到最后一行时。
    • 在递归过程中,每次尝试都需确保新位置的安全性,避免重复计算或无效配置。

此修改后的代码应该能够正确解决八皇后问题,输出所有可能的解法数量以及具体的摆放布局。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答