递归(全排列andN皇后)

全排列

分治与递归

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

思想思路

题目:

全排列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.rhkb.cn/news/343740.html

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

相关文章

wx小程序自定义tabbar

1.在app.json文件中&#xff0c;添加自定义tabbar配置&#xff1a;"custom": true "tabBar": {"custom": true,"backgroundColor": "#fafafa","borderStyle": "white","selectedColor": &quo…

“开源与闭源:AI大模型发展的未来之路“

文章目录 每日一句正能量前言数据隐私开源大模型与数据隐私闭源大模型与数据隐私数据隐私保护的共同考虑结论 商业应用开源大模型的商业应用优势&#xff1a;开源大模型的商业应用劣势&#xff1a;闭源大模型的商业应用优势&#xff1a;闭源大模型的商业应用劣势&#xff1a;商…

虚拟机与windows文件同步

如果上图中不能设置&#xff0c;则在虚拟机mnt文件夹执行以下命令&#xff1a;

Go微服务: 分布式之TCC事务

TCC 分布式事务 T: Try 预处理, 尝试执行&#xff0c;完成所有的业务检查&#xff0c;做好一致性&#xff0c;预留必要的业务资源&#xff0c;做好准隔离性C: Confirm 确认&#xff0c;如果所有的分支Try都成功了, 就到了这个阶段, Confirm 是真正执行业务的过程, 不做任何业务…

【数据结构】图论入门

引入 数据的逻辑结构&#xff1a; 集合&#xff1a;数据元素间除“同属于一个集合”外&#xff0c;无其他关系线性结构&#xff1a;一个对多个&#xff0c;例如&#xff1a;线性表、栈、队列树形结构&#xff1a;一个对多个&#xff0c;例如&#xff1a;树图形结构&#xff1…

Liunx环境下redis主从集群搭建(保姆级教学)02

Redis在linux下的主从集群配置 本次演示使用三个节点实例一个主节点&#xff0c;两个从节点&#xff1a;7000端口&#xff08;主&#xff09;&#xff0c;7001端口&#xff08;从&#xff09;&#xff0c;7002端口&#xff08;从&#xff09;&#xff1b; 主节点负责写数据&a…

澳大利亚和德国媒体投放-国外新闻发稿-海外软文推广

德国媒体 Firmenpresse德国新闻 Firmenpresse德国新闻是一家备受欢迎的新闻发布平台&#xff0c;其好友搜索引擎在收录网站方面表现出色。如果您希望更好地将您的新闻传播给德国受众&#xff0c;Firmenpresse德国新闻将是一个理想的选择。 Frankfurt Stadtanzeiger法兰克福城…

《深入浅出C语言:从基础到指针的全面指南》

1. 简介 C语言是一种通用的编程语言&#xff0c;广泛应用于系统编程、嵌入式系统和高性能应用程序。它由Dennis Ritchie在1972年开发&#xff0c;并且至今仍然非常流行。C语言以其高效、灵活和强大的功能著称&#xff0c;是许多现代编程语言的基础。 2. 基本语法 2.1 Hello, …

K8s Pod的QoS类

文章目录 OverviewPod的QoS分类Guaranteed1.如何将 Pod 设置为保证Guaranteed2. Kubernetes 调度器如何管理Guaranteed类的Pod Burstable1. 如何将 Pod 设置为Burstable2.b. Kubernetes 调度程序如何管理 Burstable Pod BestEffort1. 如何将 Pod 设置为 BestEffort2. Kubernete…

ROS云课三分钟外传之CoppeliaSim_Edu_V4_1_0_Ubuntu16_04

三分钟热度试一试吧&#xff0c;走过路过不要错过。 参考之前&#xff1a; 从云课五分钟到一分钟之v-rep_pro_edu_v3_6_2-CSDN博客 git clone https://gitcode.net/ZhangRelay/v-rep_pro_edu_v3_6_2_ubuntu16_04.gittar -xf v-rep_pro_edu_v3_6_2_ubuntu16_04/V-REP_PRO_EDU…

在当前页面拿到抽屉弹窗页面中从后端返回的值 #Vue3 #两个.vue页面之间传值问题

在当前页面拿到抽屉弹窗页面中从后端返回的值 #Vue3 #两个.vue页面之间传值问题 *解决方法一&#xff1a; 将抽屉弹窗里从后端返回得到的值缓存在浏览器中&#xff0c;在当前页面中从浏览器中获取该值。 &#xff08;原理其实就是借助第三个盒子来传递一下值&#xff0c;太小学…

在npm发布自己的组件包

目录 前言 正文 npm和git的对比 Node环境的配置 具体发布步骤 ※※需要注意的是 尾声 &#x1f52d; Hi,I’m Pleasure1234&#x1f331; I’m currently learning Vue.js,SpringBoot,Computer Security and so on.&#x1f46f; I’m studying in University of Nottingham Ni…

金融领域的AI解决方案

AI可赋能金融营销、资管、风控等领域&#xff0c;面向金融消费者、金融机构和金融监管机构&#xff0c;改善金融 市场信息对称性并提升金融交易的效率和安全性。目前&#xff0c;金融行业各机构对于安全认证和客户身份识别的需求较为迫切&#xff0c;身份识别和智能客服应用和落…

如何在没有密码的情况下解锁iPhone

通常&#xff0c;您可以使用密码、FaceID 或 Touch ID 轻松解锁 iPhone。但是&#xff0c;有时您可能会忘记密码、iPhone 已停用或您的二手手机已锁定。在这种情况下&#xff0c;您必须绕过 iPhone 密码才能访问您的设备。在本文中&#xff0c;我们将向您介绍 5 种经过测试的方…

JavaEE初阶---多线程编程(一.线程与进程)

目录 &#x1f923;一.线程与进程的概念与联系&#xff1a; 进程的基本概念&#xff1a; 线程的基本概念&#xff1a; 进程和线程的区别与联系&#xff1a; &#x1f643;代码执行实列&#xff1a; 1.通过继承Thread父类来实现多线程 2.通过实现Runnable接口来实现多线程…

Leetcode3171. 找到按位与最接近 K 的子数组

Every day a Leetcode 题目来源&#xff1a;3171. 找到按位与最接近 K 的子数组 解法1&#xff1a;位运算 优化&#xff1a; 代码&#xff1a; /** lc appleetcode.cn id3171 langcpp** [3171] 找到按位与最接近 K 的子数组*/// lc codestart class Solution { public:int m…

路由器作为网络扩展器——设置桥接、路由模式

下面提到的路由器都是家用路由器 一、有线桥接(交换模式) 1.连接示意图 (副路由器只看交换模式部分) 副路由器充当交换机的角色 二、无线桥接(与有线类似) &#xff08;副路由器的无线信号 连接 主路由器的无线信号&#xff09; 三、路由模式 1.连接示意图 (副路由器只看…

RT-DETR 详解之 Efficient Hybrid Encoder

在先前的博文中&#xff0c;博主介绍了RT-DETR在官方代码与YOLOv8集成程序中的训练与推理过程&#xff0c;接下来&#xff0c;博主将通过代码调试的方式来梳理RT-DETR的整个过程。 整体结构 RT-DETR的代码调试大家可以参考博主这篇文章&#xff1a; 在梳理整个代码之前&…

Serverless 使用OOS将http文件转存到对象存储

目录 背景介绍 系统运维管理OOS 文件转存场景 前提条件 实践步骤 附录 示例模板 背景介绍 系统运维管理OOS 系统运维管理OOS&#xff08;CloudOps Orchestration Service&#xff09;提供了一个高度灵活和强大的解决方案&#xff0c;通过精巧地编排阿里云提供的OpenAPI…

监控摄像机接入GB28181平台如何获取监控视频

各种型号监控摄像头或硬盘录像机接入 GB28181平台配置过程非常简单明了&#xff0c;但有些细节需要注意&#xff0c;避免走弯路。 1、基本要求 &#xff08;1&#xff09;网络要求 总的来说&#xff0c;只要监控设备和GB28181平台的网络是连通的&#xff0c;设备可以主动访问…