递归【1】(全排列andN皇后)(排列型回溯)

news2024/11/25 9:35:04

全排列

分治与递归

递归是实现分治的一种方法

思想思路

题目:

全排列i

我这样直接输出会多输出一个空行(最后一个\n)

#include<stdio.h>

using namespace std;
const int maxn=10;
int an[maxn];
int n;
bool hash[maxn]={0};
int c=0;
void pl(int index)
{
	if (index>n-1)
{
	for (int i=0;i<n-1;i++)
	printf("%d ",an[i]);
	printf("%d",an[n-1]);
	 printf("\n");
	return;
	}		 
	for(int i=1;i<=n;i++)
	{
		if (!hash[i])
		{
			an[index]=i;
			hash[i]=1;
			pl(index+1);
			c++;
			hash[i]=0;
		}
	}
 } 
 int main()
 {
 	scanf("%d",&n);pl(0);
 }

使用vector存储,在最后一格时不输出

 参考解答

#include <cstdio>
#include <vector>
using namespace std;

const int MAXN = 8 + 1;
vector<vector<int> > result;
vector<int> temp;
int n;
bool used[MAXN] = {false};

void DFS(int idx) {
    if (idx == n + 1) {
        result.push_back(temp);
        return;
    }
    for (int i = 1; i <= n; i++) {
        if (!used[i]) {
            temp.push_back(i);
            used[i] = true;
            DFS(idx + 1);
            used[i] = false;
            temp.pop_back();
        }
    }
}

int main() {
    scanf("%d", &n);
    DFS(1);
    for (int i = 0; i < result.size(); i++) {
        for (int j = 0; j < result[i].size(); j++) {
            printf("%d", result[i][j]);
            printf(j + 1 < result[i].size() ? " " : "\n");
        }
    }
    return 0;
}

 我也改好了

#include<stdio.h>
#include<vector>
using namespace std;
const int maxn=10;
//int an[maxn];
vector<vector<int> > ans;
vector<int> temp;
int n;
bool hasha[maxn]={0};
int c=0;
void pl(int index)
{
	if (index>n-1)
{
//for(int j=0;j<temp.size();j++)printf("%d ",temp[j]);
	ans.push_back(temp);
//	for (int i=0;i<n-1;i++)
//	printf("%d ",an[i]);
//	printf("%d",an[n-1]);
//	 printf("\n");
//	return;
	}		 
	for(int i=1;i<=n;i++)
	{
		if (!hasha[i])
		{
			temp.push_back(i);
			hasha[i]=1;
			pl(index+1);
			hasha[i]=0;
			temp.pop_back();
//			an[index]=i;
//			hash[i]=1;
//			pl(index+1);
//			c++;
//			hash[i]=0;
		}
	}
 } 
 int main()
 {
 	scanf("%d",&n);pl(0);
 	for(int i=0;i<ans.size();i++)
 	{
 		for(int j=0;j<n;j++)
 		{
 			printf("%d",ans[i][j]);
             if (j<n-1)printf(" ");
		 }
		if(i<ans.size()-1)printf("\n");
	 }
	
 	
 }

N皇后

判断8皇后

弃用数组,研究vector的用法搞了半天关于vector的一些菜鸟吐槽-CSDN博客

首先弄明白bool

true是1,false是0

用了二维vector,加上各种边界条件总算搞出来了

可是时间复杂度on3

#include<stdio.h>
#include<vector>
#include<iostream>
using namespace std;
int n=8;
vector<vector<int> > a=vector<vector<int> >(8, vector<int>(8, 0));;
// vector<vector<int> > board = vector<vector<int> >(8, vector<int>(8, 0));

int jud(int n,vector<vector<int> > a)//??
{int sum1=0,sum2=0;

	for(int i=0;i<n;i++)
	{sum1=0;sum2=0;
		for(int j=0;j<n;j++)
		{sum1+=a[i][j];sum2+=a[j][i];
//行和为1,列和为1

//		printf("##??--%d%d%dn%dj%d-\n",i,sum1,sum2,n,j)	;
			if(a[i][j]==1)
			{
			
			for(int k=0;k<n;k++)
			{
			
					if(i+j-k<n&&i+j-k>=0&&i+j-k!=i)
				{
					if(a[i+j-k][j]==a[i][j])
					{return false;}
				}
				if(k+j-i<n&&k+j-i>=0&&k!=i)
				{
					if(a[k][k+j-i]==a[i][j])
					{return false;}
				}
			}
			}
			else if (a[i][j]!=0) 					{return false;}

//		printf("#--%d%d%d-\n",i,sum1,sum2)	;
		}
		
	
if(sum1!=1||sum2!=1) 					{return false;}

}
return true;}
int main()
{
int n1=8;
int ins;
int b[n1][n1];
//printf("%d %d",bool(true),bool(false));
		for(int i=0;i<n1;i++)
		for(int j=0;j<n1;j++)
		{scanf("%d",&ins);a[i][j]=ins;}
//printf("%d",jud(n1,a));
if(jud(n1,a))printf("YES"); else printf("NO");
}

事实上答案只用了1-D数组(1的单坐标),并且遍历比我少一半(j>i)即可,减少重复

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

bool isValidQueenPlacement(const vector<vector<int>>& board) {
    int n = board.size();
    vector<int> positions(n, -1); // positions[i] 表示第 i 行的皇后所在的列

    // 遍历棋盘,找出所有皇后的位置
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (board[i][j] == 1) {
                positions[i] = j;
            }
        }
    }

    // 检查皇后之间的冲突
    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            // 检查是否有两个皇后在同一列
            if (positions[i] == positions[j]) {
                return false;
            }
            // 检查是否有两个皇后在同一对角线上
            if (abs(positions[i] - positions[j]) == abs(i - j)) {
                return false;
            }
        }
    }

    return true;
}

int main() {
    vector<vector<int>> board = vector<vector<int>>(8, vector<int>(8, 0));

    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
            cin >> board[i][j];
        }
    }

    cout << (isValidQueenPlacement(board) ? "YES" : "NO") << endl;

判断这里也巧用绝对值

 不过他没有判断皇后同行,似乎是包含在这两个之中了。?

N皇后

·和全排列一样,需要使用hashtable记录某个数字是否被使用

这个错代码看了好多遍了,愣是没发现错在哪

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;
const int N=9;
vector<vector<int> > a;
vector<int> temp;
int hashe1[N+2]={0};
void  p(int index,int n)
{
	if (index==n)
	{printf("?");
		a.push_back(temp);
	}
	for(int i=1;i<n;i++)
	{
		if(hashe1[i]==0)
			for (int j=0;j<index;j++)
			{
			temp.push_back(i);
			hashe1[i]=1;
			p(index+1,n);
			hashe1[i]=0;
			temp.pop_back();		
			}

			}
	}
			
			

	

//}
int main()
{int n=8;
p(0,n);printf("%d",a.size());
}

,对比我自己上次写的全排列,才发现是循环多套了一层。构造排列之后直接判断+pushback还原现场一系列操作即可,但是你却多搞了个j从1-n?

改了还是错

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;
const int N=9;
vector<vector<int> > a;
vector<int> temp;
int hashe1[N+2]={0};
void  p(int index,int n)
{
	if (index==n)
	{printf("?");
		a.push_back(temp);
	}
	for(int i=1;i<n;i++)
	{
		if(hashe1[i]==0)
		
			{
			temp.push_back(i);
			hashe1[i]=1;
			p(index+1,n);
			hashe1[i]=0;
			temp.pop_back();		
			}

			
	}
}
			
			

	

//}
int main()
{int n=8;
p(0,n);printf("%d",a.size());
}

艹!少了个等于!i从1~n,我写的i<n...

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;
const int N=9;
vector<vector<int> > a;
vector<int> temp;
int hashe1[N+2]={0};
void  p(int index,int n)
{
	if (index>n-1)
	{printf("?");
		a.push_back(temp);
	}
	for(int i=1;i<=n;i++)
	{
		if(hashe1[i]==0)
		
			{
			temp.push_back(i);
			hashe1[i]=1;
			p(index+1,n);
			hashe1[i]=0;
			temp.pop_back();		
			}

			
	}
}
			
			

	

//}
int main()
{int n=8;
p(0,n);printf("%d",a.size());
}

 这下至少构造排列部分对了

 然后输出还是0,崩了

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;
const int N=9;
vector<vector<int> > a;
vector<int> temp;
int hashe1[N+2]={0};
bool flag=0;
//bool j(vector<int> a)
//{
//	for(int i=0;i<a.size();i++)
//	{//不用判断同行同列,因为造出了是排列
//	for(int j=i+1;i<a.size();j++)
//	{
//		if(abs(a[j]-a[i])==j-i) return false;
//	 } 
//	}
//	return true;
// } 
void  p(int index,int n)
{
	if (index==n)
	{
		a.push_back(temp);return;
	}
	for(int i=1;i<=n;i++)
	{
		if(hashe1[i]==0)
	
		{
		if(index==0)
		{
			temp.push_back(i);
			hashe1[i]=1;
			
			p(index+1,n);
		
			hashe1[i]=0;
			temp.pop_back();
		}
		else{
			//printf("?");
//			flag=0;
			for(int k=0;k<index;k++)
			{//printf("**%d %d %d %d.\n",k,index,temp[k],i);
					if(abs(i-temp[k])==abs(index-k)) 
				{//printf("*%d %d %d %d.\n",k,index,temp[k],i);
				flag=1;break;}
			}
				if(!flag)
				{//printf("**");
			temp.push_back(i);
			hashe1[i]=1;
			p(index+1,n);
			hashe1[i]=0;
			temp.pop_back();
					
				}
					
				

			}
	}
			
			
		}
	}
	

//}
int main()
{int n=8;
p(0,n);printf("%d",a.size());
}

竟是因为少了个flag归零。蹦

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;
const int N=9;
vector<vector<int> > a;
vector<int> temp;
int hashe1[N+2]={0};
bool flag=0;
//bool j(vector<int> a)
//{
//	for(int i=0;i<a.size();i++)
//	{//不用判断同行同列,因为造出了是排列
//	for(int j=i+1;i<a.size();j++)
//	{
//		if(abs(a[j]-a[i])==j-i) return false;
//	 } 
//	}
//	return true;
// } 
void  p(int index,int n)
{
	if (index==n)
	{
		a.push_back(temp);return;
	}
	for(int i=1;i<=n;i++)
	{
		if(hashe1[i]==0)
	
		{
		if(index==0)
		{
			temp.push_back(i);
			hashe1[i]=1;
			
			p(index+1,n);
		
			hashe1[i]=0;
			temp.pop_back();
		}
		else{
			//printf("?");
			flag=0;//这句话害我浪费一个晚上
			for(int k=0;k<index;k++)
			{//printf("**%d %d %d %d.\n",k,index,temp[k],i);
					if(abs(i-temp[k])==abs(index-k)) 
				{//printf("*%d %d %d %d.\n",k,index,temp[k],i);
				flag=1;break;}
			}
				if(!flag)
				{//printf("**");
			temp.push_back(i);
			hashe1[i]=1;
			p(index+1,n);
			hashe1[i]=0;
			temp.pop_back();
					
				}
					
				

			}
	}
			
			
		}
	}
	

//}
int main()
{int n=8;
p(0,n);printf("%d",a.size());
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32-15-DMA

STM32-01-认识单片机 STM32-02-基础知识 STM32-03-HAL库 STM32-04-时钟树 STM32-05-SYSTEM文件夹 STM32-06-GPIO STM32-07-外部中断 STM32-08-串口 STM32-09-IWDG和WWDG STM32-10-定时器 STM32-11-电容触摸按键 STM32-12-OLED模块 STM32-13-MPU STM32-14-FSMC_LCD 文章目录 STM…

【Java面试】十七、并发篇(上)

文章目录 1、synchronized关键字的底层原理&#xff1a;Monitor2、synchronized相关2.1 为什么说synchronized是重量级锁2.2 synchronized锁升级之偏向锁2.3 synchronized锁升级之轻量级锁 3、Java内存模型JMM4、CAS4.1 CAS流程4.2 CAS底层实现 5、volatile关键字的理解5.1 可见…

区块链(Blockchain)调查研究(一)

文章目录 1. 区块链是什么&#xff1f;2. 区块链分类和特点3. 区块链核心关键技术3.1 共识机制3.2 密码学技术3.4 分布式存储3.5 智能合约 4. 区块链未来发展趋势5. 区块链能做什么、不能做什么&#xff1f;5.1 第一部分5.2 第二部分5.3 第三部分&#xff08;结论&#xff09; …

八爪鱼现金流-019-个人对接支付,个人网站支付解决方案

背景&#xff1a; 随着用户量不断增加&#xff0c;服务器成本越来越大。想着实现会员制回点服务器成本。 业务场景分析&#xff1a; 用户在站点上付款 -----> 我监听到付款金额 -----> 给用户开通会员 调研&#xff1a; 支付宝和微信官方支付接口&#xff1a;基本都需…

MOS管十大品牌

MOS管十大品牌-场效应管品牌排行-MOS管品牌-Maigoo品牌榜

统计学研硕大数据统计练手11

统计学论文练手作业 题目AI绘图仅供欣赏 题目 2024年的《政府工作报告》中提出“深化大数据、人工智能等研发应用,开展“人工智能+”行动,打造具有国际竞争力的数字产业集群”,请同学们结合自己工作的所在行业或领域谈一谈大数据技术在人工智能时代下的应用现状、存在的问…

VSC++: 民意调查比例法

void 民意调查比例法() {//缘由https://bbs.csdn.net/topics/396521294?page1#post-411408461从题目描述看&#xff1a;902/3~300.7&#xff0c;1498/5~299.6也就是大约求2个数的公约数&#xff0c;并使得这个公约数尽量求出最小误差&#xff1f;且商小于某值。int a 0, aa …

JS(JavaScript)的引用方式介绍与代码演示

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

Mamba v2诞生:3 SMA与Mamba-2

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提…

从品牌的角度看老字号五芳斋如何“粽”出年轻味?

端午划着龙舟的浆又来到了我们身边&#xff0c;咸鸭蛋和粽子已经裹上精美的包装在货架上等待着它们的“有缘人”&#xff0c;其实长期以来&#xff0c;说起吃粽子除了“甜咸口”的辩论赛&#xff0c;貌似在产品上却并没有太多的创新&#xff0c;但近几年随着消费市场的不断创新…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 6月9日,星期日

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年6月9日 星期日 农历五月初四 1、 人社部&#xff1a;个人养老金开户人数已超6000万&#xff0c;其中31岁至40岁的中高收入人群是开户、缴费和购买产品的主力军。 2、 医保局刊文&#xff1a;研究显示集采仿制药替代原研药…

网关API(SpringCloudGateway)如何自定义Filter

1.前言 SpringCloud 虽然给我们提供了很多过滤器&#xff0c;但是这些过滤器功能都是固定的&#xff0c;无法满足用户的各式各样的需求。因此SpringCloud提供了过滤器的扩展功能自定过滤器。 开发者可以根据自己的业务需求自定义过滤器。 2. 自定义 GatewayFilter(局部过滤器)…

LangChain4j实战

基础 LangChain4j模型适配: Provider Native Image Sync Completion Streaming Completion Embedding Image Generation Scoring Function Calling OpenAI ✅ ✅ ✅ ✅ ✅ ✅ Azure OpenAI ✅ ✅ ✅ ✅ ✅ Hugging Face ✅ ✅ Amazon Bedrock ✅ ✅…

STM32中ADC在cubemx基础配置界面介绍

ADCx的引脚,对应的不同I/O口&#xff0c;可以复用。 Temperature :温度传感器通道。 Vrefint :内部参照电压。 Conversion Trigger: 转换触发器。 IN0 至 IN15,是1ADC1的16个外部通道。本示例中输出连接的是ADC2的IN5通道&#xff0c;所以只勾选IN5.Temperature Sensor Cha…

【C++】:模板初阶和STL简介

目录 一&#xff0c;泛型编程二&#xff0c;函数模板2.1 函数模板概念2.2 函数模板格式2.3 函数模板的原理2.4 函数模板的实例化2.5 模板参数的匹配原则 三&#xff0c;类模板3.1 类模板的定义格式3.2 类模板的实例化 四&#xff0c;STL简介&#xff08;了解&#xff09;4.1 什…

将字符串str1复制为字符串str2

定义两个字符数组str1和str2&#xff0c;再设两个指针变量p1和p2&#xff0c;分别指向两个字符数组中的有关字符&#xff0c;通过改变指针变量的值使它们指向字符串中的不同的字符&#xff0c;以实现字符的复制。编写程序&#xff1a; 运行程序&#xff1a; 程序分析&#xff1…

STM32H750启动和内存优化(分散加载修改)

前些日子有个朋友一直给我推荐STM32H750这款芯片&#xff0c;说它的性价比&#xff0c;说它多么多么好。于是乎&#xff0c;这两天试了试&#xff0c;嚯&#xff0c;真香&#xff01;我们先看看基本配置 这里简单总结下&#xff0c;cortex-m7内核&#xff0c;128k片内flash …

【Java面试】十六、并发篇:线程基础

文章目录 1、进程和线程的区别2、并行和并发的区别3、创建线程的四种方式3.1 Runnable和Callable创建线程的区别3.2 线程的run和start 4、线程的所有状态与生命周期5、新建T1、T2、T3&#xff0c;如何保证线程的执行顺序6、notify和notifyAll方法有什么区别7、wait方法和sleep方…

Django Forbidden (CSRF cookie not set.)解决办法

解决办法就是在setting.py文件中注释&#xff1a; django.middleware.csrf.CsrfViewMiddleware, 这个中间件是为了防止跨站请求伪造的&#xff0c;平时用网页表单请求时&#xff0c;post提交是没有问题的&#xff0c;但是用api调用时就会被禁止&#xff0c;为了能使用接口调用…

文件怎么去重?5个技巧,教你删除重复文件!

一般来说&#xff0c;在处理大量文件时&#xff0c;你可能会遇到重复的类似文件。这些文件占据了电脑上不必要的磁盘空间&#xff0c;导致系统性能下降。而这些文件可以是不同类型的&#xff0c;如照片、视频、音频、存档、文档等。正因如此&#xff0c;您需要通过文件去重来删…