首页 > 编程语言 >Java数据结构与算法(回溯算法)

Java数据结构与算法(回溯算法)

时间:2024-06-11 17:00:25浏览次数:13  
标签:Java int List 算法 solutions 回溯 queens col row

前言

回溯算法是一种通过构建问题的解树(或解图)来逐步构建候选解的通用算法。它尝试通过一系列选择来解决问题,选择可能包括移动、添加一个元素到当前解、决定一个解的某部分等。当发现某个选择无法导致一个有效解时,算法会回退(即回溯),撤销该选择,并尝试其他选择。回溯算法通常用于解决组合优化问题、排列问题、子集问题、图的着色问题、数独等。

实现原理

回溯算法主要包括以下几个步骤:

  1. 选择:在当前步骤,尝试所有可能的选择。
  2. 约束:检查选择是否满足问题的约束条件。
  3. 递归:如果选择满足约束条件,则向前推进到下一步(递归调用)。
  4. 回溯:如果选择不满足约束条件,或者当前选择导致无法得到解,则撤销该选择(回溯),并尝试其他选择。

具体代码实现(N皇后)

要求在一个 N x N 的棋盘上放置 N 个皇后,使得每个皇后都无法攻击到其他任何一个皇后。

import java.util.ArrayList;
import java.util.List;

public class NQueens {
    public List<List<String>> solveNQueens(int n) {
        List<List<String>> solutions = new ArrayList<>();
        int[] queens = new int[n]; // 用一维数组表示棋盘,queens[i]表示第i行皇后所在的列
        solve(0, n, queens, solutions);
        return solutions;
    }

    private void solve(int row, int n, int[] queens, List<List<String>> solutions) {
        if (row == n) {
            solutions.add(generateBoard(queens, n));
            return;
        }

        for (int col = 0; col < n; col++) {
            if (isValid(row, col, queens)) {
                queens[row] = col;
                solve(row + 1, n, queens, solutions);
                queens[row] = -1; // 回溯
            }
        }
    }

    private boolean isValid(int row, int col, int[] queens) {
        for (int i = 0; i < row; i++) {
            if (queens[i] == col || Math.abs(queens[i] - col) == Math.abs(i - row)) {
                return false;
            }
        }
        return true;
    }

    private List<String> generateBoard(int[] queens, int n) {
        List<String> board = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            char[] row = new char[n];
            for (int j = 0; j < n; j++) {
                row[j] = '.';
            }
            row[queens[i]] = 'Q';
            board.add(new String(row));
        }
        return board;
    }

    public static void main(String[] args) {
        NQueens nQueens = new NQueens();
        int n = 4;
        List<List<String>> solutions = nQueens.solveNQueens(n);
        for (List<String> solution : solutions) {
            for (String row : solution) {
                System.out.println(row);
            }
            System.out.println();
        }
    }
}

QA:待定

标签:Java,int,List,算法,solutions,回溯,queens,col,row
From: https://blog.csdn.net/acuteeagle01/article/details/139588120

相关文章

  • JavaScript中什么是类,如何使用?
    在JavaScript中,类是一种用于创建对象的模板。它定义了对象的属性和方法,并可以通过实例化来创建具体的对象。类提供了一种结构化的方式来组织和管理代码,使得代码更易于理解和维护。下面我将通过三个例子来详细说明JavaScript中类的概念和使用方法。例子1:创建一个表示人的类cl......
  • 算法课程笔记——树状数组基础
    算法课程笔记——树状数组基础如果不这样写会一直循环出错......
  • Java多线程(一):多线程基础
    多线程技术概述线程与进程进程:一个内存中运行的应用程序每个进程有一个独立的内存空间线程进程中的一个执行路径·共享一个内存空间·线程间自由切换,并发执行·一个进程至少有一个线程·线程实际上是在进程基础之上的进一步划分,一个进程启动之后,里面的若干......
  • 有趣的算法题之购物单
    购物单王强决定把年终奖用于购物,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子:主件附件电脑打印机,扫描仪书柜图书书桌台灯,文具工作椅无如果要买归类为附件的物品,必须先买该附件所属的主件,且每件物品只能购买一次。每个主件可以有 ......
  • 初阶java学习2
    Notepad软件高级记事本有行号,而且Java中的一些特殊单词会高亮显示方便我们对报错进行修改;常见的高级记事本Editplus、Notepad++、Sublime(前端程序员常用)等Notepad++下载方式百度网盘:百度网盘请输入提取码提取码:e36o编码选择ANSI可以让我们输出中文;JAVA的三......
  • 基于Vue+Node.js的高校学业预警系统+10551(免费领源码)可做计算机毕业设计JAVA、PHP、爬
    NodeJS高校学业预警系统摘 要随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,教育行业当然也不能排除在外。高校学业预警系统是以实际运用为开发背景,运用软件工程开发方法,采用Node.JS技术构建的一个管理系统。......
  • JavaSE中的IO(输入/输出)字节流字符流
    JavaSE中的IO(输入/输出)知识是一个广泛的领域,它涵盖了如何在Java程序中进行数据的读取和写入。以下是对JavaSE中IO知识的一个清晰归纳:一、基础知识流(Stream)的概念流是一组有顺序的、有起点和终点的字节集合,用于数据传输。Java的I/O流提供了读写数据的标准方法。Java的I/O......
  • 53道Java基础高频题整理(附答案背诵版)
    Java为什么被称为平台无关性语言?Java被称为平台无关性语言,是因为一旦Java代码被编译成字节码,这些字节码就可以在任何安装了Java虚拟机(JVM)的设备上运行,无论这个设备使用的是什么操作系统。这就是“一次编写,到处运行”的理念。Java的这种平台无关性主要得益于Java虚拟机(JVM)......
  • Pytorch 实现简单的 线性回归 算法
    Pytorch实现简单的线性回归算法简单tensor的运算Pytorch涉及的基本数据类型是tensor(张量)和Autograd(自动微分变量)importtorchx=torch.rand(5,3)#产生一个5*3的tensor,在[0,1)之间随机取值y=torch.ones(5,3)#产生一个5*3的Tensor,元素都是1z=x+y......
  • 针对PDF文档:印章、数字签名、编辑保护、PDF/A的Java工具类
    背景  本文是基于Java语言,引入POI从而提供将富文本编辑器内的html内容转换为docx的方式。代码  引入pom坐标<dependency><groupId>cn.net.pap</groupId><artifactId>pap4j-common-pdf</artifactId><version>0.0.1</version></......