递归(全排列andN皇后)

news2024/12/27 13:38:57

全排列

分治与递归

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

思想思路

题目:

全排列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/1800765.html

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

相关文章

第十一届蓝桥杯C++青少年组中/高级组国赛2020年10月真题解析

一、单选题 第1题 在数组中&#xff0c;数组名表示&#xff08; &#xff09;. A:数组第1个元素的首地址 B:数组第2个元素的首地址 C:数组所有元素的首地址&#xff0c; D:数组最后1个元素的首地址 答案&#xff1a;A 数组名是一个地址&#xff0c;指向第一个元素 第2题 …

mqtt-emqx:设置遗嘱消息

【pom.xml】 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.3.12.RELEASE</version> </dependency> <dependency><groupId>org.eclipse…

Socket编程权威指南(一)打通网络通信的任督二脉

在网络化的今天&#xff0c;Socket已成为构建分布式系统、实现进程间通信的利器。无论是搭建Web服务器、还是开发网络游戏&#xff0c;Socket编程技能都是必不可少的武器。本文将为你娓娓道来Socket编程的精髓&#xff0c;包括基本流程概览、常用函数剖析&#xff0c;以及精彩实…

html--圣诞树

将以下代码保存到txt文件中&#xff0c;并改名为xx.html <html> <head> <title>圣诞树</title> <meta charset"utf-8" > <style> html, body { width: 100%; height: 100%; margin: 0; padding: 0; border: 0; } div { margin: …

云原生架构案例分析_4.某电商业务云原生改造

名称解释&#xff1a; AHAS&#xff1a;应用高可用服务&#xff08;Application High Availability Service&#xff09;是一款专注于提高应用高可用能力的SaaS产品&#xff0c;主要包含多活容灾、故障演练和流量防护三个独立的功能模块。其中流量防护已迁移至微服务治理服务MS…

mac配置Personal Access Tokens

背景 在macbook环境中&#xff0c;使用idea、android studio、xcode时&#xff0c;使用gitlab需要登录&#xff0c;而直接使用文明密码是不允许登录的&#xff0c;这时就需要换种方式&#xff0c;这里有两种&#xff1a;ssh、Access Tokens&#xff0c;在公用电脑上推荐使用Ac…

AI办公自动化:批量把docx文档转换为txt文本

任务&#xff1a;把docx文档批量转换成txt&#xff0c;首先让deepseek写了一段代码&#xff0c;但是转换失败。用的是最流行的python-docx库来读取docx文档&#xff0c;但是始终无法读取成功&#xff0c;换成pywin32库就解决问题了。 在deepseek中输入提示词&#xff1a; 写一…

Android 常用开源库 MMKV 源码分析与理解

文章目录 前言一、MMKV简介1.mmap2.protobuf 二、MMKV 源码详解1.MMKV初始化2.MMKV对象获取3.文件摘要的映射4.loadFromFile 从文件加载数据5.数据写入6.内存重整7.数据读取8.数据删除9.文件回写10.Protobuf 实现1.序列化2.反序列化 12.文件锁1.加锁2.解锁 13.状态同步 总结参考…

subline text3安装numpy,scipy,matplotlib,pandas,sklearn,ipynb

1&#xff0c;numpy&#xff08;基础数值算法&#xff09; 安装&#xff0c;要是在cmd直接安装到最后会报错, import numpy as np ModuleNotFoundError: No module named numpy 直接进入python环境&#xff0c;输入python -m pip install numpy就不会报错…

Webpack是什么,和vue3有什么关系?

Webpack 是一个流行的 JavaScript 模块打包工具&#xff0c;它可以将项目中的各种资源&#xff08;如 JavaScript、CSS、图片等&#xff09;进行模块化处理并打包成一个或多个输出文件。这样做的主要目的是提高网页的加载速度和性能&#xff0c;同时便于管理和维护项目代码。 …

数据挖掘--数据仓库与联机分析处理

什么是数据仓库 &#xff08;面集时非&#xff09; 面向主题的&#xff1a;围绕某一主题来构建集成的&#xff1a;图片文字杂糅在一起时变的&#xff1a;随时间变化的数据非易失的&#xff1a;硬盘存放&#xff0c;不易丢失 操作数据库系统&#xff08;OLTP)与数据仓库(OLAP…

mac环境基于llama3和metaGPT自动开发2048游戏

1.准备虚拟环境 conda create -n metagpt python3.9 && conda activate metagpt 2.安装metagpt pip install --upgrade metagpt 3.初始化配置文件 metagpt --init-config 4. 安装llama3 5. 修改配置文件 6.让metegpt自动开发2048游戏 7.经过多轮迭代&#xff0c;最终…

微软必应地图的三维实景功能

偶然看到微软必应地图的三维实景功能&#xff0c;由于比较感兴趣这方面的技术&#xff0c;所以试用了一下,感觉总体来说技术上比咱们自己的技术和设计要好很多。比如这个工具栏就设计的很简洁&#xff0c;人性化&#xff1a; 而且实景地图的范围也非常大&#xff0c;建立这么大…

2024.6.7学习记录

1、css面试题复习加整理 2、dp刷题 也是水

Dell服务器根据GPU温度调整风扇转速

前言 dell服务器自动风扇是根据CPU温度来调速的&#xff0c;我跑AI的时候cpu温度不高但是GPU温度很高导致显卡卡死PVE虚拟机直接挂起无法运行&#xff0c;我看了下也没有基于显卡温度调速的脚本&#xff0c;于是我就自己写了一个 基于ipmi工具 乌班图等linux先安装ipmi apt …

[UE 虚幻引擎] DTLoadFbx 运行时加载FBX本地模型插件说明

本插件可以在打包后运行时动态加载FBX模型。 新建一个Actor 并添加一个 DT Runtime Fbx Component。 然后直接调用组件的函数 LoadFile 加载显示模型&#xff08;注&#xff1a;不支持模型动画&#xff09; FilePath : 加载模型的绝对路径。 Create Collision : 是否创建碰撞…

【Python】解决Python报错:ValueError: not enough values to unpack (expected 2, got 1)

​​​​ 文章目录 引言1. 错误详解2. 常见的出错场景2.1 函数返回值解包2.2 遍历含有不同长度元组的列表 3. 解决方案3.1 检查和调整返回值3.2 安全的解包操作 4. 预防措施4.1 使用异常处理4.2 单元测试 结语 引言 在Python编程中&#xff0c;ValueError 是一个常见的异常类…

纷享销客安全体系:安全运维运营

安全运维运营(Security Operations,SecOps)是指在信息安全管理中负责监控、检测、响应和恢复安全事件的一系列运营活动。它旨在保护组织的信息系统和数据免受安全威胁和攻击的损害。 通过有效的安全运维运营&#xff0c;组织可以及时发现和应对安全威胁&#xff0c;减少安全事…

数据整理操作及众所周知【数据分析】

各位大佬好 &#xff0c;这里是阿川的博客&#xff0c;祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 Python 初阶 Python–语言基础与由来介绍 Python–…

56.WEB渗透测试-信息收集- 端口、目录扫描、源码泄露(4)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;55.WEB渗透测试-信息收集- 端口、目录扫描、源码泄露&#xff08;3&#xff09; 如果把文…