IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> N皇后经典算法——Java -> 正文阅读

[数据结构与算法]N皇后经典算法——Java

一、题目

N皇后问题要求求解在N*N的棋盘上放置N个皇后,

并使各皇后彼此不受攻击的所有可能的棋盘布局,

皇后彼此不受攻击的约束条件是:任何两个皇后均不能在棋盘上同一行、同一列或者同一对角线上出现。

输入:

     给定棋盘的大小n 

输出:

     输出有多少种放置方法?

二、方法

回溯法:

利用试探性的方法,在包含问题所有解的解空间树中,将可能的结果搜索一遍,从而获得满足条件的解。搜索过程采用深度遍历策略,并随时判定结点是否满足条件要求,满足要求就继续向下搜索,若不满足要求则回溯到上一层,这种解决问题的方法称为回溯法。

回溯法求解问题步骤:

  1. 针对问题,画出问题的简易版解空间树
  2. 确定易于搜索的解空间结构
  3. 以深度优先方式搜索解空间,并且在搜索过程中永剪枝函数避免无效搜索(简单来说就是遍历过后不是我们要的就把它抛弃,用以提高效率)

以3皇后为例:
从第一层开始,一种可能一种可能的逐步遍历,遍历到底部如果还没找到便回溯到上一层继续遍历。
在这里插入图片描述
每一次递归时,此方格格放了可能非正解,就排除,提前判断check(),符合条件递归往下走。并给此方格标记‘W’,不符合在此列换下个格子,若都不符合此列递归完成到前一列状态,在判断,往往复复、直至得到正解输出继续未完成任务(此不是唯一解,所以还要继续,找到所有的解,若为唯一解,找到后用exit(0)退出程序)
每一次递归,如果不是正解,数组会被改变,所以不成立时用回溯回到上一个for循环状态

for (int i=0;i<n;i++){
            if(check(res,i,row)){           //i——行|| row——列
                res[i][row]='W';
                dfs(res,n,row+1);           //多重循环体,多多理解!
                res[i][row]='*';            //回溯
            }
        }

check 作为判断是否符合条件,此格纵横斜均无皇后
纵:res[x][i]‘W’ 有返回false
横:res[i][y]‘W’ 有返回false
斜:斜向是 i+jx+y 正向、i-jx-y 反向
用check方法判断是否符合条件

static boolean check(char res[][],int x,int y){
        for(int i=0;i<res.length;i++){
            if(res[x][i]=='W')return false; //纵:res[x][i]‘W’ 有返回false
            if(res[i][y]=='W')return false; //横:res[i][y]‘W’ 有返回false

            for(int j=0;j<res.length;j++){
                if(i+j==x+y&&res[i][j]=='W')return false;
                if(i-j==x-y&&res[i][j]=='W')return false;
            }
        }
        return true;
    }

完整代码:

import java.util.Scanner;

public class NQueen{
    public static void main(String[] args) {			//主函数
        Scanner scanner=new Scanner(System.in);//新创建一个输入的Scanner对象,然后赋值给sanner(作用就是获取控制台输入)
        System.out.print("请输入皇后个数:");
        int n=scanner.nextInt();			//输入函数
        char res[][]=new char[n][n];				//对数组初始化
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                res[i][j]='*';
            }
        }
        dfs(res,n,0);			//调用深搜函数
        System.out.print("符合条件的个数为:");
        System.out.println(account);
    }
    static int account=0;
    static void dfs(char res[][],int n,int row){
        if(row==n){
            account++;
            System.out.println();
            for(int i=0;i<n;i++){
                for(int j=0;j<n;j++){
                    System.out.print(res[i][j]+"  ");
                }
                System.out.println();
            }
            return;
        }
        for (int i=0;i<n;i++){
            if(check(res,i,row)){
                res[i][row]='W';
                dfs(res,n,row+1);
                res[i][row]='*';
            }
        }
    }
    static boolean check(char res[][],int x,int y){
        for(int i=0;i<res.length;i++){
            if(res[x][i]=='W')return false; //纵:res[x][i]‘W’ 有返回false
            if(res[i][y]=='W')return false; //横:res[i][y]‘W’ 有返回false

            for(int j=0;j<res.length;j++){
                if(i+j==x+y&&res[i][j]=='W')return false;
                if(i-j==x-y&&res[i][j]=='W')return false;
            }
        }
        return true;
    }
}

运行截图:

在这里插入图片描述

备注:一定重点理解多重循环!不然不好理解n皇后问题

部分资源来自原文链接

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-22 14:55:44  更:2021-09-22 14:55:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 2:49:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码