N皇后问题的java解法

import java.util.Scanner;
public class Solution{
    static int N=20;
    static char[][] path=new char[N][N];
    static boolean[] col = new boolean[N],dg = new boolean[N],udg = new boolean[N];
    static int n=0;
    public static void dfs(int u){
      if(u==n){
          for(int i=0;i<n;i++){
              for(int j=0;j<n;j++)
                  System.out.print(path[i][j]+" ");
                  System.out.println();
          }
       
      } 
      else
          for(int i=0;i<n;i++){
              if(!col[i] && !dg[u+i] && !udg[n-u+i]){
              path[u][i]='Q';
              col[i]=dg[u+i]=udg[n-u+i]=true;
              dfs(u+1);
              path[u][i]='*';
              col[i]=dg[u+i]=udg[n-u+i]=false;
            }
         }
    }
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                path[i][j]='*';
        dfs(0);
    }
}

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个基于回溯法的 Java 代码实现,用于解决 n 皇后问题: ```java public class NQueens { private int[] queens; // 存放皇后所在列的位置 private int n; // 皇后个数 private int count; // 解法数 public int solveNQueens(int n) { this.n = n; queens = new int[n]; count = 0; backtrack(0); return count; } private void backtrack(int row) { if (row == n) { // 找到一组解 count++; return; } for (int col = 0; col < n; col++) { if (isValid(row, col)) { // 判断该位置是否可以放置皇后 queens[row] = col; backtrack(row + 1); } } } private boolean isValid(int row, int col) { for (int i = 0; i < row; i++) { if (queens[i] == col || Math.abs(row - i) == Math.abs(col - queens[i])) { return false; // 同一列或同一对角线已有皇后 } } return true; } } ``` 在这个实现中,`queens` 数组存放每行皇后所在的列位置,`n` 表示皇后个数,`count` 初始为 0,用于统计解法数。`solveNQueens` 方法返回解法数,内部调用 `backtrack` 方法进行回溯搜索。`isValid` 方法用于判断该位置是否可以放置皇后,即该位置所在列、左上对角线、右上对角线是否已经有皇后。 回溯法是一种常用的解决搜索问题的算法,其思路是通过枚举所有可能的解,找到符合条件的解。在 n 皇后问题中,我们从第一行开始,枚举该行的所有位置,判断该位置是否可行,如果可行则继续递归搜索下一行,如果不可行则回溯到上一行。这样,当找到一组解时,我们就可以记录下来并开始寻找下一组解。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值