求n個數全排列的第m個,,
深搜的順序就是排列的順序
8!=40320
給的m<=10000,所以只要排列八個數就可以了
[cpp]
#include<stdio.h>
#include<string.h>
int m,n,count,num[9],k,link[9];
void dfs(int u)
{
int i;
if(count==m)return;
if(u==9)
{
count++;
if(count==m)
{
if(n<=8)
{
printf("%d",num[k+1]-k);
for(i=k+2;i<=8;i++)
printf(" %d",num[i]-k);
printf("\n");
}
else
{ printf("1");
for(i=2;i<=k;i++)
printf(" %d",i);
for(i=1;i<=8;i++)
printf(" %d",num[i]+k);
printf("\n");
}
}
}
for(i=1;i<=8;i++)
{
if(link[i]==0)
{
link[i]=1;
num[u]=i;
dfs(u+1);
link[i]=0;
}
}
}
int main()
{
int i,j;
while(scanf("%d%d",&n,&m)!=-1)
{
memset(num,0,sizeof(num));
memset(link,0,sizeof(link));
count=0;
if(n<8)
k=8-n;
else k=n-8;
dfs(1);
}
return 0;
}
#include<stdio.h>
#include<string.h>
int m,n,count,num[9],k,link[9];
void dfs(int u)
{
int i;
if(count==m)return;
if(u==9)
{
count++;
if(count==m)
{
if(n<=8)
{
printf("%d",num[k+1]-k);
for(i=k+2;i<=8;i++)
printf(" %d",num[i]-k);
printf("\n");
}
else
{ printf("1");
for(i=2;i<=k;i++)
printf(" %d",i);
for(i=1;i<=8;i++)
printf(" %d",num[i]+k);
printf("\n");
}
}
}
for(i=1;i<=8;i++)
{
if(link[i]==0)
{
link[i]=1;
num[u]=i;
dfs(u+1);
link[i]=0;
}
}
}
int main()
{
int i,j;
while(scanf("%d%d",&n,&m)!=-1)
{
memset(num,0,sizeof(num));
memset(link,0,sizeof(link));
count=0;
if(n<8)
k=8-n;
else k=n-8;
dfs(1);
}
return 0;
}