N皇后 能看懂但不会敲

/**  
 * 回溯法求解 N 皇后问题  
 * @author haolloyin  
 */ 
public class N_Queens {  
      
    // 皇后的个数  
    private int queensNum = 4;  
 
    // column[i] = j 表示第 i 列的第 j 行放置一个皇后  
    private int[] queens = new int[queensNum + 1];  
 
    // rowExists[i] = true 表示第 i 行有皇后  
    private boolean[] rowExists = new boolean[queensNum + 1];  
 
    // a[i] = true 表示右高左低的第 i 条斜线有皇后  
    private boolean[] a = new boolean[queensNum * 2];  
 
    // b[i] = true 表示左高右低的第 i 条斜线有皇后  
    private boolean[] b = new boolean[queensNum * 2];  
      
    // 初始化变量  
    private void init() {  
        for (int i = 0; i < queensNum + 1; i++) {  
            rowExists[i] = false;  
        }  
          
        for(int i = 0; i < queensNum * 2; i++) {  
            a[i] = b[i] = false;  
        }  
    }  
 
    // 判断该位置是否已经存在一个皇后,存在则返回 true  
    private boolean isExists(int row, int col) {  
        return (rowExists[row] || a[row + col - 1] || b[queensNum + col - row]);  
    }  
 
    // 主方法:测试放置皇后  
    public void testing(int column) {  
 
        // 遍历每一行  
        for (int row = 1; row < queensNum + 1; row++) {  
            // 如果第 row 行第 column 列可以放置皇后  
            if (!isExists(row, column)) {  
                // 设置第 row 行第 column 列有皇后   
                queens[column] = row;  
                // 设置以第 row 行第 column 列为交叉点的斜线不可放置皇后  
                rowExists[row] = a[row + column - 1] = b[queensNum + column - row] = true;  
                  
                // 全部尝试过,打印  
                if(column == queensNum) {  
                    for(int col = 1; col <= queensNum; col++) {  
                        System.out.print("("+col + "," + queens[col] + ")  ");  
                    }  
                    System.out.println();  
                }else {  
                    // 放置下一列的皇后  
                    testing(column + 1);  
                }  
                // 撤销上一步所放置的皇后,即回溯  
                rowExists[row] = a[row + column - 1] = b[queensNum + column - row] = false;  
            }  
        }  
    }  
      
    // 测试  
    public static void main(String[] args) {  
        N_Queens queen = new N_Queens();  
        queen.init();  
        // 从第 1 列开始求解  
        queen.testing(1);  
    }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值