输出全排列利用递归实现
每一层递归排列好一个数字,抵达边界就输出
#include <cstdio>
using namespace std;
int n,P[11],hashTable[11]={false};
void generateP(int index)
{
if(index == n+1)//抵达边界,开始输出
{
for(int i=1;i<=n;i++)
printf("%d",P[i]);
printf("\n");
return;
}
for(int x=1;x<=n;x++)
{
if(hashTable[x]==false)//hashTable 判断第x位是否已经有数字排列好了
{
P[index]=x;
hashTable[x]=true;
generateP(index+1);//排列下一个位置
hashTable[x]=false;
}
}
}
int main()
{
n = 3;
generateP(1);
return 0;
}
n皇后问题可以理解为全排列的一种问题,不过要加上判断,不能在同一对角线
#include <cstdio>
using namespace std;
int n,P[11],hashTable[11]={false};
void generateP(int index)
{
if(index == n+1)//抵达边界,开始输出
{
bool flag = true;
for(int i =1;i<=n;i++)
{
for(int j =i+1;j<=n;j++)
if(abs(i-j)==abs(p[i]-p[j]))
flag=false;
}
if(flag)
cou++;
return;
}
for(int x=1;x<=n;x++)
{
if(hashTable[x]==false)//hashTable 判断第x位是否已经有数字排列好了
{
P[index]=x;
hashTable[x]=true;
generateP(index+1);//排列下一个位置
hashTable[x]=false;
}
}
}
利用回溯法进行优化,提前判断后续是否可行
void generateP(int index)
{
if(index == n+1)
{
return;//抵达此处必定合法
}
for(int x=1;x<=n;x++)
{
if(hashTable[x]==false)
{
bool flag = true;
for(int pre = 1;pre < index;pre++)
{
if(abs(i-j)==abs(p[i]-p[j]))
{
flag=false;break;
}
}
if(flag){
P[index]=x;
hashTable[x]=true;
generateP(index+1);//排列下一个位置
hashTable[x]=false;
}
}
}
}