递归排列枚举(c++)

全部排列问题
输入 n
输出 1…n 个数的全部排列。全部排列中,数字可以重复 。
例如
输入 3
输出全部排列的结果如下:111、112、113、121、122、123、131、132、133、211、212、213、221、222、223、231、232、233、311、312、313、321、322、323、331、332、333。
输入
一个整数 n(1<n≤6)。
输出
按照由小到大的顺序输出 1…n 这 n 个数的全部排列情况。
输入复制
2
输出复制
11
12
21
22
#include<bits/stdc++.h>
#include <iostream>
using namespace std;
int a[10] = {0};
void aaa(int,int);
int main()
{
	int n;
	cin>>n;
	aaa(n,0);
	
	return 0;
}
void aaa(int n,int sum)
{
	if(sum>=n)
	{
		for(int i = 0;i<sum;i++)
		{
			cout<<a[i];
		}
		cout<<endl;
		return;
	}
	for(int i = 1;i<=n;i++)
	{
		a[sum] = i;
		aaa(n,sum+1);
	}
	return;
}

#include<bits/stdc++.h>
#include <iostream>
using namespace std;
int a[10] = {0};
int f[10] = {0};
void aaa(int,int);
int main()
{
	int n;
	cin>>n;
	aaa(n,0);
	
	return 0;
}
void aaa(int n,int sum)
{
	if(sum>=n)
	{
		for(int i = 0;i<sum;i++)
		{
			cout<<a[i]<<" ";
		}
		cout<<endl;
		return;
	}
	for(int i = 1;i<=n;i++)
	{
		if(f[i]==0)
		{
			a[sum] = i;
			f[i] = 1;
			aaa(n,sum+1);
			f[i] = 0;
		}
	}
	return;
}

n个数的全排列
问题描述
从键盘读入
n 个整数(每个数都是 1 9 之间的数),输出这 n 个整数的全排列(数字不能重复)。
输入
第 1 行输入一个整数 n。(1≤n≤8)
第 2 行输入 n 个不相等的整数。(每个数在 [1,9] 的范围内)
输出
输出若干行,每行包括 n 个数据,表示一种排列方案,所有的排列按字典码从小到大排序输出。
样例
输入复制
3
4 6 2
输出复制
2 4 6
2 6 4
4 2 6
4 6 2
6 2 4
6 4 2
#include <iomanip>
#include <iostream>
using namespace std;
int a[10] = {0};
int f[10] = {0};
int b[10] = {0};
void aaa(int,int);
int main()
{
	int n;
	cin>>n;
	for(int i = 1;i<=n;i++)
	{
		cin>>b[i];
	}
	aaa(n,0);
	return 0;
}
void aaa(int n,int sum)
{
	if(sum>=n)
	{
		for(int i = 0;i<sum;i++)
		{
			cout<<setw(3)<<a[i]<<" ";
		}
		cout<<endl;
		return;
	}
	for(int i = 1;i<=n;i++)
	{
		if(f[i]==0)
		{
			a[sum] = b[i];
			f[i] = 1;
			aaa(n,sum+1);
			f[i] = 0;
		}
	}
	return;
}

n个数取出r个数排列
从 1 n 任意挑出r 个数进行排列,请从小到大输出所有可能的排列结果。
如:n=5,r=2,则输出结果如下
1 2
1 3
1 4
1 5
2 1
2 3
2 4
2 5
3 1
3 2
3 4
3 5
4 1
4 2
4 3
4 5
5 1
5 2
5 3
5 4
输入
两个整数 n 和 r ( n 和 r 都是 3 6 之间的整数)
输出
从 1 n 中取出 r 个数的排列结果!
#include <iomanip>
#include <iostream>
using namespace std;
int a[10] = {0};
int f[10] = {0};
int r;
void aaa(int,int);
int main()
{
	int n;
	cin>>n>>r;
	aaa(n,0);
	return 0;
}
void aaa(int n,int sum)
{
	if(sum>=r)
	{
		for(int i = 0;i<sum;i++)
		{
			cout<<setw(3)<<a[i]<<" ";
		}
		cout<<endl;
		return;
	}
	for(int i = 1;i<=n;i++)
	{
		if(f[i]==0)
		{
			a[sum] = i;
			f[i] = 1;
			aaa(n,sum+1);
			f[i] = 0;
		}
	}
	return;
}

三个三位数

描述

将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数构成 1:2:3的比例,试 求出所有满足条件的三个三位数。

例如:

三个三位数192,384,576满足以上条件。

输入

无。

输出

每行三个三位数,为满足条件的一种方案。这三个三位数按从小到大的方式给出,相邻两个数之间 用单个空格隔开。 请按照第一个三位数从小到大的顺序依次输出每种方案。

#include <iomanip>
#include <iostream>
using namespace std;
int a[10] = {0};
int f[10] = {0};
int b[510] = {0};
int summ = 0;
void aaa(int,int,int);
int main()
{
	
	aaa(9,3,0);
	for(int i = 0;i<summ;i++)
	{
		for(int j = i+1;j<summ;j++)
		{
			for(int k = j+1;k<summ;k++)
			{
				int a1,a2,a3,a11,a22,a33,a111,a222,a333;
				a1 = b[i]/1%10;
				a2 = b[i]/10%10;
				a3 = b[i]/100%10;
				a11 = b[j]/1%10;
				a22 = b[j]/10%10;
				a33 = b[j]/100%10;
				a111 = b[k]/1%10;
				a222 = b[k]/10%10;
				a333 = b[k]/100%10;
				int aa[10] = {0};
				aa[a1]++;
				aa[a2]++;
				aa[a3]++;
				aa[a11]++;
				aa[a22]++;
				aa[a33]++;
				aa[a111]++;
				aa[a222]++;
				aa[a333]++;
				bool f = true;
				for(int i = 1;i<=9;i++)
				{
					if(aa[i]>1)
					{
						f = false;
						break;
					}
				}
				if(f==true)
				{
					if(b[i]*3==b[k]&&b[i]*2==b[j])
					{
						cout<<b[i]<<" "<<b[j]<<" "<<b[k]<<endl;
					}
				}
			}
		}
	}
	
	return 0;
}
void aaa(int n,int r,int sum)
{
	if(sum>=r)
	{
		for(int i = 0;i<sum;i++)
		{
			b[summ] = b[summ]*10+a[i];
		}
		summ++;
		return;
	}
	for(int i = 1;i<=n;i++)
	{
		if(f[i]==0)
		{
			a[sum] = i;
			f[i] = 1;
			aaa(9,3,sum+1);
			f[i] = 0;
		}
	}
	return;
}

特 殊 的 质 数 肋 骨

问 题 描 述

农 民 约 翰 的 母 牛 总 是 产 生 最 好 的 肋 骨 。 你 能 通 过 农 民 约 翰 和 美 国 农 业 部 标 记 在 每 根 肋 骨 上 的 数 字 认 出 它 们 。

农 民 约 翰 确 定 他 卖 给 买 方 的 是 真 正 的 质 数 肋 骨,是 因 为 从 右 边 开 始 切 下 肋 骨,每 次 还 剩 下 的 肋 骨 上 的 数 字 都 组 成 一 个 质 数 。

举 例 来 说:

全部肋骨上 的 数 字 7 3 3 1 是 质 数 ; 三 根 肋 骨 7 3 3 是 质 数 ; 二 根 肋 骨 7 3 是 质 数 ; 当 然,最 后 一 根 肋 骨 7 也 是 质 数 。 7 3 3 1 被 叫 做 长 度 4 的 特 殊 质 数 。

写 一 个 程 序 对 给 定 的 肋 骨 的 数 目 n ,求 出 所 有 的 特 殊 质 数 。 1 不 是 质 数 。

输 入 复 制

4

输 出 复 制

2 3 3 3

2 3 3 9

2 3 9 3

2 3 9 9

2 9 3 9

3 1 1 9

3 1 3 7

3 7 3 3

3 7 3 9

3 7 9 3

3 7 9 7

5 9 3 9

7 1 9 3

7 3 3 1

7 3 3 3

7 3 9 3

#include <iostream>
using namespace std;
int a[10] = {0};
int r;
void aaa(int,int);
bool zhishu(int);
int main()
{
	int n = 9;
	cin>>r;
	aaa(n,0);
	
	return 0;
}
void aaa(int n,int sum)
{
	if(sum>=r)
	{
		int b = 0;
		bool f = true;
		for(int i = 0;i<sum;i++)
		{
			b = b*10+a[i];
			if(zhishu(b)==false)
			{
				f = false;
				break;
			}
		}
		if(f==true) cout<<b<<endl;
		return;
	}
	for(int i = 1;i<=n;i++)
	{
		a[sum] = i;
		aaa(n,sum+1);
	}
	return;
}
bool zhishu(int n)
{
	if(n==1) return false;
	if(n==2) return true;
	for(int i = 2;i<n;i++)
	{
		if(n%i==0) return false;
	}
	return true;
}

谷仓的保安

Farmer John给谷仓安装了一个新的安全系统,并且要给牛群中的每一个奶牛安排一个有效的密码。一个有效的密码 由 L (3≤L≤15)个小写字母(来自传统的拉丁字母集'a'...'z')组成,至少有一个元音('a', 'e', 'i', 'o', 或者 'u'),至少两个辅音 (除去元音以外的音节),并且有按字母表顺序出现的字母(例如,'abc'是有效的,而'bac'不是)

 给定一个期望长度 L 和 C 个小写字母,写一个程序,打印出所有的长度为 L、能由这些字母组成的有效密码。密码必 须按字母表顺序打印出来,一行一个。

输入

第一行: 两个由空格分开的整数,L 和 C 。(3≤C≤26)

第二行: C 个空格分开的小写字母,密码是由这个字母集中 的字母来构建的。

输出

输出若干行,每一个输出行包括一个长度为 L 个字符的密 码(没有空格)。输出行必须按照字母顺序排列。

如果计算出超过 25000 个有效密码,你的程序只需输出前 25000 个有效密码,即使后面还存在有效密码。

输入复制

4 6

a t c i s w

输出复制

acis

acit

aciw

acst

acsw

actw

aist

aisw

aitw

astw

cist

cisw

citw

istw

#include <iomanip>
#include <iostream>
#include <algorithm>
using namespace std;
char a[30] = {'\0'};
int f[30] = {0};
char b[30] = {'\0'};
int cnt  = 0;
int c;
void aaa(int,int);
int main()
{
	int l;
	cin>>l>>c;
	for(int i = 0;i<c;i++)
	{
		cin>>b[i];
	}
	sort(b+0,b+c);
	aaa(l,0);
	
	return 0;
}
void aaa(int l,int sum)
{
	if(sum>=l)
	{
		if(cnt<25000)
		{
			bool fy = false;
			for(int i = 0;i<l;i++)
			{
				if(a[i]=='a'||a[i]=='e'||a[i]=='i'||a[i]=='o'||a[i]=='u')
				{
					fy = true;
					break;
				}
			}
			if(fy==false) return;
			
			
			bool ff = false;
			int cnt2 = 0;
			for(int i = 0;i<l;i++)
			{
				if(a[i]!='a'&&a[i]!='e'&&a[i]!='i'&&a[i]!='o'&&a[i]!='u')
				{
					cnt2++;
				}
				if(cnt2==2)
				{
					ff = true;
					break;
				}
			}
			if(ff==false) return;
			
			

			bool fyx = true;
			for(int i = 0;i<l-1;i++)
			{
				if(a[i]>a[i+1])
				{
					fyx = false;
					break;
				}
			}
			if(fyx==false) return;
			
			
			
			cnt++;
			for(int i = 0;i<sum;i++)
			{
				cout<<a[i];
			}
			cout<<endl;
		}
		return;
	}
	for(int i = 0;i<c;i++)
	{
		if(f[i]==0)
		{
			a[sum] = b[i];
			f[i] = 1;
			aaa(l,sum+1);
			f[i] = 0;
		}
	}
	return;
}

#include <iostream>
using namespace std;
int a[50];
int f[50];
int cnt;
void aaa(int,int);
bool zhishu(int);
int main()
{
	int n;
	cin>>n;
	cnt = 0;
	aaa(n,0);
	cout<<"total:"<<cnt;
	return 0;
}
void aaa(int n,int sum)
{
	if(sum>=n)
	{
		if(zhishu(a[n-1]+a[0])==true)
		{
			cnt++;
			cout<<cnt<<":";
			for(int i = 0;i<n;i++)
			{
				cout<<a[i]<<" ";
			}
			cout<<endl;
		}
	}
	for(int i = 1;i<=n;i++)
	{
		if(f[i]==0)
		{
			if(sum==0)
			{
				f[i] = 1;
				a[sum] = i;
				aaa(n,sum+1);
				f[i] = 0;
			}
			else
			{
				if(zhishu(i+a[sum-1])==true)
				{
					f[i] = 1;
					a[sum] = i;
					aaa(n,sum+1);
					f[i] = 0;
				}
			}
		}
	}
	return;
}
bool zhishu(int n)
{
	if(n==1) return false;
	if(n==2) return true;
	for(int i = 2;i<n;i++)
	{
		if(n%i==0) return false;
	}
	return true;
}

素数环2

从1∼n 这 n 个数,摆成一个环,个数字首尾相连,形成一个圆环,要求圆环上任意两个相邻的数字之和 都是一个素数,请编程输出符合条件的素数环。

输入

输入数据仅一行,包含一个正整数 n(n≤20)。

输出

输出数据最多包括 10 行,每行由 n 个整数组成,表示前十个符合条件的素数环(不 足十个时全部输出)。

所有素数环第一个元素必须是 1 ,且按照从小到大的顺序排列。

输入复制

6

输出复制

1 4 3 2 5 6

1 6 5 2 3 4

#include <iostream>
using namespace std;
int a[50];
int f[50];
void aaa(int,int);
bool zhishu(int);
int main()
{
	int n;
	cin>>n;
	aaa(n,0);
	return 0;
}
void aaa(int n,int sum)
{
	if(sum>=n)
	{
		if(zhishu(a[n-1]+a[0])==true&&a[0]==1)
		{
			for(int i = 0;i<n;i++)
			{
				cout<<a[i]<<" ";
			}
			cout<<endl;
		}
	}
	for(int i = 1;i<=n;i++)
	{
		if(f[i]==0)
		{
			if(sum==0)
			{
				f[i] = 1;
				a[sum] = i;
				aaa(n,sum+1);
				f[i] = 0;
			}
			else
			{
				if(zhishu(i+a[sum-1])==true)
				{
					f[i] = 1;
					a[sum] = i;
					aaa(n,sum+1);
					f[i] = 0;
				}
			}
		}
	}
	return;
}
bool zhishu(int n)
{
	if(n==1) return false;
	if(n==2) return true;
	for(int i = 2;i<n;i++)
	{
		if(n%i==0) return false;
	}
	return true;
}

  • 18
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值