N皇后问题

N皇后问题

题目描述
N皇后问题是指在N*N的棋盘上要摆N个皇后,要求任何两个皇后不同行,不同列也不再同一条斜线上,求给一个整数n,返回n皇后的摆法。
输入描述:
输出一个整数,代表n(1≤n≤14)。
输出描述:
输出一个整数,代表n皇后的种数。


import java.util.Scanner;

public class NQueen{

    public static int result(int n){
        if(n < 1){
            return 0 ;
        }
        //record记录每一行的皇后所属的列位置
        //record数组索引值为行数,record数组存的值为列数
        int[] record = new int[n] ;
        return process1(0 , record , n) ;
    }

    /**
     * 主方法,递归判断
     * @param i
     * @param record
     * @param n
     * @return
     */
    public static int process1(int i , int[] record , int n){
        if(i == n){
            return 1 ;
        }
        //res记录数量
        int res = 0 ;

        for(int j=0 ; j<n ; j++){
            //判断此位置是否可以放置皇后
            if(isValiable(i , j , record)){
                record[i] = j ;
                res += process1(i+1 , record , n) ;
            }
        }

        return res ;
    }

    /**
     * 判断第i行第j列是否可以放置皇后
     * @param i 当前行
     * @param j 当前列
     * @param record 数据
     * @return
     */
    public static boolean isValiable(int i , int j , int[] record){
        //从第一行开始到当前行结束
        for(int k=0 ; k<i ; k++){
            //record[k] == j 同一列有没有皇后
            //Math.abs(record[k] - j) == Math.abs(k - i) 对角线有没有皇后
            if(record[k] == j || Math.abs(record[k] - j) == Math.abs(k - i)){
                return false ;
            }
        }
        return true ;
    }

    public static void main(String[] args){
        Scanner input = new Scanner(System.in) ;
        int n = input.nextInt() ;
        System.out.println(result(n)) ;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值