T51 N皇后

思想:跟解数独那题很像,同样都是先枚举每一行的情况,如果能枚举到第n行,表示有解
只不过数独是保证每一行,每一列,每一个Box中元素唯一;
这里的N皇后是保证每一行,每一列,每一个条斜线上(主对角线和次对角线)只有一个Q

class Solution {
    List<List<String>> res = new ArrayList<>();
    public boolean validate(char[][]board,int row,int col){//判断每一行,每一列,每一个斜线上是否只有一个Q
        if(board[row][col]=='Q')return false;
        int n = board.length;
        for(int k=0;k<n;k++){//判断每一行,每一列上是否只有1个Q
            if(board[row][k]=='Q')return false;
            if(board[k][col]=='Q')return false;
        }
        for(int r=row,c=col;r>=0&&c>=0;r--,c--){//判断该元素所在的主对角线上中该元素左上方的位置上是否没有Q
            if(board[r][c]=='Q')return false;
        }
        for(int r=row,c=col;r>=0&&c<n;r--,c++){//判断该元素所在的次对角线上该元素的右上方的位置上是否没有Q
            if(board[r][c]=='Q')return false;
        }
        return true;
    }
    public void helper(char[][]board,int row,List<String>trace){
        int n = board.length;
        if(row==n){
            res.add(new ArrayList<String>(trace));
            return;
        }
        for(int col=0;col<n;col++){
            if(validate(board,row,col)){
                board[row][col] = 'Q';
                trace.add(new String(board[row]));
                helper(board,row+1,trace);
                board[row][col] = '.';
                trace.remove(trace.size()-1);
            }
        }
    }
    public List<List<String>> solveNQueens(int n) {
       if(n<=0) return res;
       char[][]board = new char[n][n];//生成n*n的棋盘
       for(int i=0;i<n;i++){
          Arrays.fill(board[i],'.');
       }
       helper(board,0,new ArrayList<String>());
       return res;
    }
}

N皇后变形-||:仅求所有的解的个数

class Solution {
    int res = 0;
    public boolean validate(char[][]board,int row,int col){//判断每一行,每一列,每一个斜线上是否只有一个Q
        if(board[row][col]=='Q')return false;
        int n = board.length;
        for(int k=0;k<n;k++){//判断每一行,每一列上是否只有1个Q
            if(board[row][k]=='Q')return false;
            if(board[k][col]=='Q')return false;
        }
        for(int r=row,c=col;r>=0&&c>=0;r--,c--){//判断该元素所在的主对角线上中该元素左上方的位置上是否没有Q
            if(board[r][c]=='Q')return false;
        }
        for(int r=row,c=col;r>=0&&c<n;r--,c++){//判断该元素所在的次对角线上该元素的右上方的位置上是否没有Q
            if(board[r][c]=='Q')return false;
        }
        return true;
    }
    public void helper(char[][]board,int row){
        int n = board.length;
        if(row==n){
            res++;
            return;
        }
        for(int col=0;col<n;col++){
            if(validate(board,row,col)){
                board[row][col] = 'Q';
                helper(board,row+1);
                board[row][col] = '.';
            }
        }
    }
    public int totalNQueens(int n) {
       if(n<=0) return res;
       char[][]board = new char[n][n];//生成n*n的棋盘
       for(int i=0;i<n;i++){
          Arrays.fill(board[i],'.');
       }
       helper(board,0);
       return res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值