P1706 全排列问题

2023-05-16

原题:P1706 全排列问题

这题显然可以暴力,长达164行:
 

#include<iostream>
#include<istream>
#include<ostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<iomanip>
#include<cctype>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<algorithm>
#include<utility>
#include<deque>
#include<ctime>
#include<sstream>
#include<list>
#include<bitset>
using namespace std;
int main(){
	int n;
	cin >> n;
	if(n==1){
		cout << "    1" << endl;
		return 0;
	}
	if(n==2){
		cout << "    1    2" << endl;
		cout << "    2    1" << endl;
		return 0;
	}
	if(n==3){
		cout << "    1    2    3" << endl;
		cout << "    1    3    2" << endl;
		cout << "    2    1    3" << endl;
		cout << "    2    3    1" << endl;
		cout << "    3    1    2" << endl;
		cout << "    3    2    1" << endl;
	}
	if(n==4){
		for(int a=1;a<=n;a++){
			for(int b=1;b<=n;b++){
				for(int c=1;c<=n;c++){
					for(int d=1;d<=n;d++){
						if(a!=b && a!=c && a!=d && b!=c && b!=d && c!=d){
							cout << "    " << a << "    " << b << "    " << c << "    " << d << endl;
						}
					}
				}
			}
		}
		return 0;
	}
	if(n==5){
		for(int a=1;a<=n;a++){
			for(int b=1;b<=n;b++){
				for(int c=1;c<=n;c++){
					for(int d=1;d<=n;d++){
						for(int e=1;e<=n;e++){
							if(a!=b && a!=c && a!=d && a!=e && b!=c && b!=d && b!=e && c!=d && c!=e && d!=e){
								cout << "    " << a << "    " << b << "    " << c << "    " << d << "    " << e << endl;
							}
						}
					}
				}
			}
		}
		return 0;
	}
	if(n==6){
		for(int a=1;a<=n;a++){
			for(int b=1;b<=n;b++){
				if(a!=b){
					for(int c=1;c<=n;c++){
						if(b!=c){
							for(int d=1;d<=n;d++){
								if(c!=d){
									for(int e=1;e<=n;e++){
										if(d!=e){
											for(int f=1;f<=n;f++){
												if(a!=b && a!=c && a!=d && a!=e && a!=f && b!=c && b!=d && b!=e && b!=f && c!=d && c!=e && c!=f && d!=e && d!=f && e!=f){
													cout << "    " << a << "    " << b << "    " << c << "    " << d << "    " << e << "    " << f << endl; 
												}
											}
										}
									}
								}
							}
						}
					}
				}
			} 
		} 
		return 0;                          
	}
	if(n==7){
		for(int a=1;a<=n;a++){
			for(int b=1;b<=n;b++){
				if(a!=b){
					for(int c=1;c<=n;c++){
						if(b!=c){
							for(int d=1;d<=n;d++){
								if(c!=d){
									for(int e=1;e<=n;e++){
										if(d!=e){
											for(int f=1;f<=n;f++){
												if(e!=f){
													for(int g=1;g<=n;g++){
														if(a!=b && a!=c && a!=d && a!=e && a!=f && a!=g && b!=c && b!=d && b!=e && b!=f && b!=g && c!=d && c!=e && c!=f && c!=g && d!=e && d!=f && d!=g && e!=f && e!=g && f!=g){
															cout << "    " << a << "    " << b << "    " << c << "    " << d << "    " << e << "    " << f << "    " << g << endl; 
														}
													}
												}
											}
										}
									}
								}
							}
						}
					}
				}
			}
		}
		return 0;
	}
	if(n==8){
		for(int a=1;a<=n;a++){
			for(int b=1;b<=n;b++){
				if(a!=b){
					for(int c=1;c<=n;c++){
						if(b!=c){
							for(int d=1;d<=n;d++){
								if(c!=d){
									for(int e=1;e<=n;e++){
										if(d!=e){
											for(int f=1;f<=n;f++){
												if(e!=f){
													for(int g=1;g<=n;g++){
														if(f!=g){
															for(int h=1;h<=n;h++){
																if(a!=b && a!=c && a!=d && a!=e && a!=f && a!=g && b!=c && b!=d && b!=e && b!=f && b!=g && c!=d && c!=e && c!=f && c!=g && d!=e && d!=f && d!=g && e!=f && e!=g && f!=g && a!=h && b!=h && c!=h && d!=h && e!=h && f!=h && g!=h){
																	cout << "    " << a << "    " << b << "    " << c << "    " << d << "    " << e << "    " << f << "    " <<  g << "    " << h << endl;
																}
															}
														}
													}
												}
											}
										}
									}
								}
							}
						}
					}
				}
			}
		}
		return 0;
	}
}

但这只建立在n<=9的条件之上,而且代码也太长了,所以我们可以用#include<algorithm>里面的next_permutation函数来生成下一个全排列:代码长度降低到了18行!!!

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int num[15];
int main(){
	int n;
	cin>>n;
	for(register int i=1;i<=n;++i)
		num[i]=i;
	do{
		for(register int i=1;i<=n;++i){
			printf("%5d",num[i]);
		}
		printf("\n");
	}while(next_permutation(num+1,num+n+1));
	return 0;
} 

还可以用深度优先搜索(代码有注释欧).

#include<iostream>//istream ans ostream
using namespace std;//using namespace std;
int a[11];//来存全排列 
int n;//n的全排列
int total;//全排列个数 
int vis[11];//访问过? 
void search(int step)//深度优先搜索 
{
	if(step==n+1)//如果填完了 
	{
		for(int i=1;i<=n;i++)//输出排列 
		{
			cout << "    " << a[i];
		}
		total++;//总数+1
		cout << endl; 
	}
	else
	{
		for(int i=1;i<=n;i++)
		{
			if(vis[i]==0)//如果没有被访问 
			{
				a[step]=i;//增加这个数 
				vis[i]=1;//标记为true 
				search(step+1);//search(step+1)
				vis[i]=0;//回溯算法 
			}
		}
	}
}
int main()
{
	cin >> n;//输入n
	search(1);//dfs
	return 0;
}

暴力: 空间:708.00KB 时间:94ms 代码长度:3.93KB

STL:空间:620.00KB 时间:51ms 代码长度:319B

DFS:空间:620.00KB 时间:78ms 代码长度:436B

  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

P1706 全排列问题 的相关文章

  • 简单超声波测距

    用到模块 hc sr04超声波模块 xff0c stm32开发板 本实验通过超声波测距模块得到长度 直接打印到窗口显示 xff0c 故主要用到定时器函数 xff0c 串口函数 hcsr04 c 只需要提供一个 10uS以上脉冲触发信号 xf
  • Javaer,你必须要了解的ExecutorService

    ExecutorService初接触 之前做的一个功能里有一个耗时操作 xff1a 处理数据库里对应的记录 xff0c 然后将每个处理后的结果做个排序 恕本人小白 xff0c 刚开始直接用单线程处理 xff01 你敢信 xff1f xff0
  • 平衡自行车-理论篇

    原文链接 xff1a http nicekwell net blog 20180121 ping heng zi xing che li lun pian html 一 模型分析 1 倒立摆2 自行车的平衡控制 2 1 怎样的状态才叫平衡2
  • 魔百盒CM201-1刷机教程

    家里有一块魔百盒CM201 1一直在家积灰 xff0c 由于看到网上教程可以刷各种系统 xff0c 所以想着玩来试试看 先刷一个电视版安卓系统看 盒子样子大概就是下面这样 xff1a 拿到手之后就迫不及待的将外壳拆掉了 xff0c 下面这样
  • RK3288刷机教程:安装Ubuntu 16.04

    网上有很多基于瑞芯微RK3288芯片的板子 xff0c 个人感觉配置都非常不错 xff01 然后就淘了两块玩玩 如下图所示 xff1a 然后可以看到 xff0c 各种接口也比较全乎 xff01 有HDMI和VGA视频输出接口 xff0c 两
  • ros串口通讯(读取串口数据)

    ros串口通讯是非常重要的通讯手段 xff0c 通常跟下位机或者各种usb口外设都是通过串口进行通讯的 那么我们跟着教程来学习一下如何读取手机通过无线串口发送给电脑的数据 这里我通过一个usb ttl工具将蓝牙连接到电脑上 xff0c 然后
  • No package ‘orocos-bfl‘ found

    目录 问题 xff1a 原因 xff1a 解决办法 xff1a 问题 xff1a 在编译ros工程的时候 xff0c 出现如下错误提示 xff1a No package 39 orocos bfl 39 found 如下图所示 xff1a
  • 人工智能(AI)入门

    人工智能的入门学习需要具备的知识结构 xff1a 一 编程语言选择 推荐python xff0c 原因有二 xff0c 其一 xff0c 语法简单易学 xff1b 其二 xff0c 有丰富的库支持 二 算法设计基础 人工智能的研究内容集中在
  • 卡尔曼滤波(Kalman filter)算法以及Arduino应用-mpu6050(导航贴)

    正在更新中 这篇文章要跟大家一起完全搞明白卡尔曼滤波 xff0c 连一个标点符号也不放过 xff0c 完完全全理解明白 如果你看不懂 xff0c 那说明我写的不好 本文是看了dr con博士的视频后做的 xff0c 建议可以去看看 如果哪里
  • ROS发布tf坐标

    我们写个小程序来发布一个坐标系 xff1a 坐标系消息格式 xff1a std msgs Header header 头信息 uint32 seq 序列号 time stamp 时间戳 string frame id 坐标 ID strin
  • pop_back()的用法及运行机制

    vector在c 43 43 中非常好用 xff0c 简单的说 xff0c vector是一个能够存放任意类型的动态数组 能够增加和压缩数据 一般使用push back 和pop back 函数将数据存放进容器末尾 如下例程 xff1a i
  • Gazebo启动不开

    问题 xff1a 按照书上的指引 xff0c 启动gazebo仿真软件 当然记得运行roscore rosrun gazebo ros gazebo 结果我在这个页面等了三分钟一点儿动静也没有 查阅资料 xff0c 说明这是因为model库
  • Gazebo仿真小例程一(通过例程熟悉整个仿真步骤)

    目录 1 编辑urdf文件 xff08 1 xff09 dynamic标签 xff08 2 xff09 gazebo标签 xff08 3 xff09 transmission标签 xff08 4 xff09 ros control插件 2
  • Arduino ide配置esp32硬件支持(配置esp32的arduino开发环境)

    ESP32学习导航帖 前言 当我们用arduino ide基于esp32开发板进行程序开发的时候 xff0c arduino ide按照默认安装之后是无法直接给esp32下载程序的 xff0c 也不支持esp32相关的库 这主要是默认的ar
  • AS5600磁编码器的使用以及简单的滤波算法(arduino)

    目录 前言 实践 示例一 xff1a 发现IIC设备 示例二 xff1a 读取AS5600原始数据 示例三 xff1a 对读取到的AS5600原始数据进行低通滤波 1 一阶滤波算法的原理 2 编程实现 前言 AS5600磁编码器常用于电机的
  • 平衡小车的控制算法(PID,LQR,MPC)及arduino程序导航贴

    目录 平衡小车电机位置测试小实验 1 编码器脉冲计数 PID控制算法 平衡小车PID调参实验 位置环 2 编码器计数转换角度 小车整体的动力学建模 通过特征值判断系统动态特性 龙伯格观测器 平衡小车电机位置测试小实验 1 编码器脉冲计数 c
  • the selected library block “Contact_forces_lib/3D/sphere to plane force“ no longer exists

    问题 在matlab的simulink里面进行simscape仿真的时候 xff0c 由于添加了接触力 xff0c 因此实现装了 Simscape Multibody Contact Forces Library 这个库 xff0c 装完之
  • matlab画圆(及其他常用图形)

    画图 1 matlab画圆 xff08 1 xff09 代码 xff1a x 61 y 61 r 61 1 for i 61 1 100 x i 61 r cos i 2 pi 100 y i 61 r sin i 2 pi 100 plo
  • Linux或Ubuntu中查看磁盘空间大小的10个df命令

    在Linux中 xff0c 您可以使用名为df命令的命令行工具检查磁盘空间 df命令代表磁盘文件系统 使用df命令 xff0c 您可以在Linux上找到磁盘空间摘要信息 xff0c 例如可用磁盘空间和已用磁盘空间 在本教程中 xff0c 我
  • 调试平衡小车过程中间遇到的问题

    目录 定时器函数执行周期跟定时时间不一致 xff1f drv8833这款驱动器可以制作平衡小车用吗 xff1f 电机编码器AB相无输出 xff1f 平衡小车的角度标定一定要准确 平衡小车前进后退的控制逻辑是什么 xff1f 定时器函数执行周

随机推荐