目录
一、枚举排列——递归枚举 / next_permutation
一、枚举排列——递归枚举 / next_permutation
1.生成1~n的全排列
#include<stdio.h>
void print_permutation(int n,int A[],int cur)
{
int i,j,ok;
if(cur==n) //递归出口
{
for(i=0;i<n;i++)
printf("%d ",A[i]);
printf("\n");
}
else
{
for(i=1;i<=n;++i)
{
ok=1; //检查标记
for(j=0;j<cur;j++) //检查i是否已经出现在数组A[]中
{
if(A[j]==i)
ok=0;
}
if(ok)
{
A[cur]=i;
print_permutation(n,A,cur+1);
}
}
}
}
int main()
{
int n;
scanf("%d",&n);
int A[n];
print_permutation(n,A,0);
return 0;
}
2.生成输入的n个数的全排列
/*
next_permutation包含于#include<algorithm>
函数原型:bool next_permutation(iterator start,iterator end)
next_permutation(a,a+n)函数对数组a中的前n个元素进行全排列,同时改变a数组
next_permutation()在使用前需要对欲排列数组按升序排序
*/
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
int n,i;
scanf("%d",&n);
int a[n];
for(i=0;i<n;++i)
{
scanf("%d",&a[i]);
}
sort(a,a+n);
do
{
for(i=0;i<n;++i)
{
printf("%d ",a[i]);
}
printf("\n");
}while(next_permutation(a,a+n));
return 0;
}
二、回溯法
1.N皇后问题
2.素数环
/*
素数环
输入整数n,把整数1,2,3…,n组成一个环,使得相邻两个整数之和均为素数。
输出时从1开始逆时针排序。同一个环应恰好输出一次。n<=16.
样例输入:
6
样例输出:
1 4 3 2 5 6
1 6 5 2 3 4
*/
#include<bits/stdc++.h>
using namespace std;
int Ring[16],visited[17];
int n;
bool is_prime(int n) //判断是否为素数
{
int i;
for(i=n-1;i>1;--i)
{
if(n%i==0)
return false;
}
return true;
}
void dfs(int cur)
{
int i;
if(cur==n&&is_prime(Ring[0]+Ring[n-1])) //检查素数环首尾
{
for(i=0;i<n;++i)
printf("%-4d",Ring[i]);
printf("\n");
}
else if(cur==0) //整数1开始排列,防止输出相同的素数环
{
visited[1]=1;
Ring[0]=1;
dfs(cur+1);
Ring[0]=0;
}
else
{
for(i=1;i<=n;i++)
{
if(!visited[i]&&is_prime(i+Ring[cur-1]))
{
Ring[cur]=i;
visited[i]=1;
dfs(cur+1);
visited[i]=0;
}
}
}
}
int main()
{
scanf("%d",&n);
dfs(0);
return 0;
}