#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxn 1111
/*比当前数要小且在在他后面的数若从大到小排列则符合要求*/
int n,count;
int ans[maxn],vis[maxn],num[maxn];
void print();//用来输出全排列中符合要求的个数
void dfs(int k,int cnt) //深搜枚举1-n的全排列,k为数组下标,cnt为已经排列的个数
{
int i;
if(cnt==n) //当排列个数与原数据相同时,不再进行搜索
{
print();
return ;
}
for(i=0;i<n;i++)
{
if(!vis[i]) //如过当前位没有被访问过,则将他写入数组,继续进行下一位的搜索
{
vis[i]=1;
ans[cnt]=num[i];
dfs(k+1,cnt+1);
vis[i]=0; //回朔
}
}
}
void print()
{
int i,j,flag=1,h,temp;//temp用来记录比当前数小的数
for(i=0;i<n;i++)
{
h=0;//用来判断temp中有没有值
for(j=i+1;j<n&&flag;j++)
{
if(ans[i]>ans[j])
{
if(h==0) temp=ans[j],h++; //第一次比当前数小,直接将他放入temp
else
{
if(ans[j]>temp) flag=0; //当后一个比temp中的数要大,则这组数据不满足
else temp=ans[j];//否则将小的数记录
}
}
}
if(!flag) break;
}
if(flag)
{
printf("%-3d",++count);
for(i=0;i<n;i++)
printf("%d ",ans[i]);
printf("\n");
}
}
int main()
{
int i;
while(~scanf("%d",&n))
{
memset(vis,0,sizeof(vis));
count=0;
for(i=0;i<n;i++) num[i]=i+1;
dfs(0,0);
}
return 0;
}
火车进站问题
最新推荐文章于 2023-02-12 21:44:32 发布