回溯算法(3)--n皇后问题及回溯法相关习题

一、n皇后问题

1、概述

        n皇后要求在一个n×n的棋盘上放置n个皇后,使得他们彼此不受攻击,皇后可以攻击同一行、同一列、同一斜线上的敌人,所以n皇后问题要求寻找在棋盘上放置这n个皇后的方案,使得任意两个皇后都不在同一行、同一列或同一斜线上。

2、子集树解法

(1)判断是否遍历过叶子结点(t>n),若没有则遍历子集树,判断place(t),即该层从1到n是否存在有成立的情况。

(2)place剪枝函数,遍历1到t,如果存在一个点满足同一列,同一对角线,那么舍弃这个叶节点,反之保留叶节点。由于每一层保存的点存放在x数组,该数组显性约束了不满足同一行的条件,数组中的索引+1就是行号,数组值为列号。

(3)若已经满足t>n,即已经遍历过叶子结点,则输出该可行解。

3、排列树解法

(1)判断是否遍历过叶子结点(t>n),若没有则遍历排列树,对后续层进行全排列,判断place(t),即该层从1到n是否存在有成立的情况。

(2)place剪枝函数,此时由于对后续层全排列,第一层的列数不能存在于后续层,不需要添加同一列的检查,其他与子集树一致。

(3)若已经满足t>n,即已经遍历过叶子结点,则输出该可行解。

4、代码

//n皇后问题
import java.util.Scanner;
public class Queen {static int x[]=new int[100];static int n;static int sum=0;public static void main(String [] args){n=new Scanner(System.in).nextInt();//排列树提前添加x数组值,保证能够进行排列for(int i=1;i<=n;i++)x[i]=i;Backstack2(1);} //子集树算法public static void Backstack(int t){if(t>n){sum++;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(x[i]==j)System.out.print("Q ");else    System.out.print(". ");}System.out.println();}System.out.println();}else{for(int i=1;i<=n;i++){x[t]=i;if(place(t))Backstack(t+1);}}}public static boolean place(int t){for(int i=1;i<t;i++)if((Math.abs(x[i]-x[t])==Math.abs(i-t))||x[i]==x[t])return false;return true;}//排列树算法public static void Backstack2(int t){if(t>n){sum++;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(x[i]==j)System.out.print("Q ");else    System.out.print(". ");}System.out.println();}System.out.println();}else{for(int i=t;i<=n;i++){swap(i,t);if(place2(t))Backstack2(t+1);swap(i,t);}}}public static void swap(int i,int t){int tmp=x[i];x[i]=x[t];x[t]=tmp;}public static boolean place2(int t){for(int i=1;i<t;i++){if(Math.abs(x[i]-x[t])==Math.abs(i-t))return false;}return true;}
}

5、结果

        通过Q和 . 区分皇后的位置。

二、含重复元素的全排列

1、概述

        给定一个可包含重复数字的序列,按任意顺序返回所有不重复的全排列,如:输入【1,1,2】,输出【1,1,2】,【1,2,1】,【2,1,1】。

2、算法

        排列树问题,在原有问题上添加条件x[t]==x[i]&&t!=i,当前交换的两个数若相同,且不是同一个数,则剪枝,注意循环中使用continue,表示下面的交换和扩展的操作不再进行,但循环继续。

3、代码

//含重复元素的全排列
import java.util.Scanner;
public class repeatperm {public static void main(String []args){String m=new Scanner(System.in).nextLine();String []numbers=m.split("\\s+");int x[]=new int[numbers.length+1];for(int i=0;i<numbers.length;i++)x[i+1]=Integer.parseInt(numbers[i]);perm(x,1);} //全排列public static void perm(int[] x,int t){int n=x.length-1;if(t>n){for(int i=1;i<n+1;i++)System.out.print(x[i]+" ");System.out.println();}else{for(int i=t;i<n+1;i++){//约束条件,保证不再重复if(x[t]==x[i]&&t!=i)continue;swap(t,i,x);perm(x,t+1);swap(t,i,x);}}}public static void swap(int t,int i,int []x){int tmp=x[i];x[i]=x[t];x[t]=tmp;}
}

三、 组合

1、概述

        输入n和k,从1~n中任意不放回抽取k个值的所有情况,输入n=4,k=2,输出【1,2】,【1,3】,【1,4】,【2,3】,【2,4】,【3,4】。

2、算法

        子集树,在叶子结点未遍历结束前,每一层的值都为上一层的节点值到n之间所有的遍历。

3、代码

//组合问题
import java.util.Scanner;
public class combination {public static void main(String[] args){int n=new Scanner(System.in).nextInt();  //n=4int k=new Scanner(System.in).nextInt();  //k=2int x[]=new int [k+1];combine(n,k,1,x);}public static void combine(int n,int k,int t,int x[]){if(t>k){for(int i=1;i<=k;i++)System.out.print(x[i]+" ");System.out.println();}else{for(int i=x[t-1]+1;i<=n;i++){x[t]=i;combine(n,k,t+1,x);}}}
}

四、组合总和

1、概述

        输入n和k,输出1-9的任取k个数的组合中,组合加和等于n的所有可能情况。

2、算法

        子集树算法,与上一道题相同,只需要在输出的时候,添加限制总和等于n的输出。另外可以进行改进,对于问题规模过大的情况,如果未完成的组合,组合总和已经大于等于n,则进行剪枝。

3、代码

//组合总和
import java.util.Scanner;
public class combinationsum {public static void main(String[] args){int n=new Scanner(System.in).nextInt();  //n=7,判断条件和int k=new Scanner(System.in).nextInt();  //k=3int x[]=new int [k+1];combine(n,k,1,x);}public static void combine(int n,int k,int t,int x[]){if(t>k){int sum=0;for(int j:x)sum+=j;if(sum==n){for(int i=1;i<=k;i++)System.out.print(x[i]+" ");System.out.println();}}else{for(int i=x[t-1]+1;i<=9;i++){x[t]=i;combine(n,k,t+1,x);}}} 
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/192293.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

搭建 AI 图像生成器 (SAAS) php laravel

今天来搭一套&#xff0c;AI 图像生成器 是基于 Openai DALLE 2 和 Openai DALLE 3 以及 Stability AI 和稳定扩散 API 构建的脚本&#xff0c;为用户提供了使用简单的提示和大小生成独特自定义图像的可能性。在这个平台上&#xff0c;创意得以快速、高效地实现&#xff0c;借助…

【刷题专栏—突破思维】LeetCode 138. 随机链表的复制

前言 随机链表的复制涉及到复制一个链表&#xff0c;该链表不仅包含普通的next指针&#xff0c;还包含random指针&#xff0c;该指针指向链表中的任意节点或空节点。 文章目录 原地修改链表 题目链接&#xff1a; LeetCode 138. 随机链表的复制 原地修改链表 题目介绍&#xf…

3dMax2024新功能和工作流增强功能速览

3dMax2024新功能和工作流增强功能速览 Autodesk发布的3dMax2024引入了一系列新功能和工作流增强功能&#xff0c;如下所示&#xff1a; 更新的“指定控制器”卷展栏&#xff1a;这个现代化的功能为动画师提供了更高效的工作方式&#xff0c;简化了他们的动画流程。 布尔修饰符…

土地利用强度(LUI)综合指数

土地利用强度的概念可以解释为某一时间特定区域内人类活动对土地利用强度的干扰程度[1]&#xff0c;其不仅反映不同土地利用类型本身的自然属性&#xff0c;也体现了人类利用土地的深度和广度&#xff0c;进而揭示在人类社会系统干扰下土地资源自然综合体自然平衡的保持状态[2]…

MySQL主从搭建

1、MySQL主从同步原理 基本原理&#xff1a; slave会从master读取binlog来进行数据同步 具体步骤&#xff1a; step1&#xff1a;master将数据改变记录到二进制日志&#xff08;binary log&#xff09;中。step2&#xff1a; 当slave上执行 start slave 命令之后&#xff0c…

教你轻松解决win系统ucrtbased.dll丢失的问题,亲测有效!

ucrtbased.dll是一个动态链接库文件&#xff08;DLL&#xff09;&#xff0c;它是Windows操作系统中的一部分&#xff0c;主要负责提供操作系统和应用程序所需的函数和接口。这个文件包含了操作系统和应用程序共同使用的通用代码&#xff0c;以确保不同程序之间的兼容性和稳定性…

机器学习的医疗乳腺癌数据的乳腺癌疾病预测

项目视频讲解:基于机器学习的医疗乳腺癌数据的乳腺癌疾病预测 完整代码数据分享_哔哩哔哩_bilibili 效果演示: 代码: #第一步!导入我们需要的工具 import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns %matplotlib inlin…

vue2【axios请求】

1&#xff1a;axios作用 axios&#xff08;发音&#xff1a;艾克c奥斯&#xff09;是前端圈最火的&#xff0c;专注于数据请求的库。 Axios 是一个基于 promise 的 HTTP 库&#xff0c;可以用在浏览器和 node.js 中axios的github:https://github.com/axios/axios 中文官网地址…

Spring 国际化:i18n 如何使用

1、i18n概述 国际化也称作i18n&#xff0c;其来源是英文单词 internationalization的首末字符i和n&#xff0c;18为中间的字符数。由于软件发行可能面向多个国家&#xff0c;对于不同国家的用户&#xff0c;软件显示不同语言的过程就是国际化。通常来讲&#xff0c;软件中的国…

为什么Transformer模型中使用Layer Normalization(Layer Norm)而不是Batch Normalization(BN)

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

anaconda安装依赖报错ERROR: Cannot unpack file C:\Users\33659\AppData\Loca...|问题记录

执行命令&#xff1a; # 安装matplotlib依赖 pip install matplotlib-i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com出现问题&#xff1a; ERROR: Cannot unpack file C:\Users\33659\AppData\Local\Temp\pip-unpack-0au_blfq\simple (downloa…

【入门篇】1.4 redis 客户端 之 Lettuce 详解

文章目录 1. 简介1. 什么是Lettuce2. Lettuce与其他Redis客户端的比较3. Lettuce的特性和优势 2. 安装和配置3. 连接池配置1. 什么是连接池2. Lettuce的连接池使用与配置3. 连接池配置项 4. 基本操作1. 如何创建Lettuce连接2. Lettuce的基本操作如增删改查3. Lettuce的事务操作…