全排列问题的几种样式:
#include <iostream>
using namespace std;
const int maxn = 10;
int n = 3, curP[maxn], hashT[maxn] = { false };
//处理当前排列的index号位
void generateP(int index)
{
if (index == n + 1)
{
for (int i = 1; i <= n; i++)
{
cout << curP[i]<< "\t";
}
cout << "\n";
return;
}
for (int i = 1; i <= n; i++)//枚举1~n,将前面没有使用过的i填入curP[index]
{
if (hashT[i] == false)
{
curP[index] = i;
hashT[i] = true;
//通过递归可以处理完i开头的所有情况
generateP(index + 1);//处理排列的index+1位置。
hashT[i] = false;//处理完curP[index]为i的子问题,还原状态。
}
}
}
int main()
{
generateP(1);//从1开始
return 0;
}
#include<iostream>
#include<cmath>
using namespace std;
int p[10]= {0};
bool vis[10]= {0};
int n;
int m;
void dfs(int x) {
if (x==n+1) {
for(int i=1; i<=n; i++){
cout<<p[i]<<" ";
}
m++;
cout<<m<<endl;
return ;
}
for (int i=1; i<=n; i++) {
if (vis[i]==false) {
p[x] = i;
vis[i] = true;
dfs(x+1);
vis[i] = false;
}
}
}
int main() {
m=0;
while (cin>>n) {
dfs(1);
}
return 0;
}
这是那道洛谷P1036的题
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int n,k,he,ans,a[21];//he代表
//k个数的和;ans记录有几种组合,数组开到21是因为我不喜欢用0号位(同喜好的举个爪?)
int sushu(int m)//素数判断,可以对m开根号优化,不过没必要
{
for(int i=2;i<m;i++)
{
if(m%i==0)
return 0;
}
return 1;//返回1表示是素数,0代表不是,这些0或1都会加到ans里
}
void xuanshu(int l,int f)//核心代码,应该是搜索?我很cai,其中l代表差几个够k个数,f表示选到了第几个数,此数之前不选(就是栗子中的:2的后面绝对没有1)
{
if(l==0){//如果够k个数了,你懂得
ans+=sushu(he);
}
else{
f++;
for(int i=f;i<=n;i++)//从它之后的都能选,还是那个栗子2后面的3,4都可以,在想想那个栗子,如果1之后选了4会发生什么?
{
he+=a[i];
l--;
xuanshu(l,i);
he-=a[i];//这两句是为了清空之前选的那个数(的痕迹)
l++;
}
}
}
int main()//很水的主程序
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
xuanshu(k,0);
printf("%d",ans);
return 0;
}
还有一个
```cpp
#include <iostream>
using namespace std;
const int maxn = 10;
int n = 3, curP[maxn], hashT[maxn] = { false };
//处理当前排列的index号位
void generateP(int index)
{
if (index == n + 1)
{
for (int i = 1; i <= n; i++)
{
cout << curP[i]<< "\t";
}
cout << "\n";
return;
}
for (int i = 1; i <= n; i++)//枚举1~n,将前面没有使用过的i填入curP[index]
{
if (hashT[i] == false)
{
curP[index] = i;
hashT[i] = true;
//通过递归可以处理完i开头的所有情况
generateP(index + 1);//处理排列的index+1位置。
hashT[i] = false;//处理完curP[index]为i的子问题,还原状态。
}
}
}
int main()
{
generateP(1);//从1开始
return 0;
}