为什么不让用iframe….
Description
给定n个数 a[0] , a[1] …….. a[n-1], 输出其全排列。
Input
第一行输入一个数n,(n<7)
接下来一行输入n个数。
Output
按字典序从小到大输出全排列
Sample Input
3
1 2 3
3
1 2 2
Sample Output
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
1 2 2
2 1 2
2 2 1
#include
#include
int a[1000],bb,c,tl;
int lc[6000][10];
int test(int aaa[])
{
int flag;
for(int i=0;i0;
for(int ii=0;ii//printf("%d,%d \n",aaa[ii],lc[i][ii]);
if(aaa[ii]==lc[i][ii])
flag++;
}
if(flag==c)
return 0;
}
for(int i=0;ilc[tl][i]=aaa[i];
tl++;
return 1;
}
int search(int n,int aa[])
{
// printf("search with %d and %d\n",n,aa[n-1]);
int t,k[1000];
if(n>=c)
{
if(test(aa))
{
for(int i=0;iif(i!=0)
printf(" ");
printf("%d",aa[i]);
}
printf("\n");
}
}
else
for(int i=0;iif(a[i]!=-1)
{
aa[n]=a[i];
t=a[i];
a[i]=-1;
search(n+1,aa);
a[i]=t;
}
}
}
int add(int aa)
{
//printf("%d into\n",aa);
int t;
a[bb]=aa;
for(int i=bb-1;i>=0;i--)
{
if(a[i]>a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
else
break;
}
bb++;
}
int main()
{
//freopen("out.txt","w",stdout);
while(scanf("%d",&c)!=EOF)
{
tl=0,bb=0;
int d;
memset(a,0,sizeof(a));
memset(lc,0,sizeof(lc));
for(int i=0;i"%d",&d);
add(d);
}
int aaaa[10]={0};
search(0,aaaa);
}
}
没什么技术又强烈想做这题的我先祭一张图:
对,然后就写了一套深度优先搜索;
解析:这段源码在main中读入所有的值
读入同时直接用插入排序排好,省去了后续的排序过程.
接着,从0位开始深度优先搜索.
搜索第一位,然后判断,一位不为-1,则把一位标记(占领)为-1,然后1位进行搜索search(1,aa);
这里为了方便,就把记录结果的数组带着走了.每次调用前,都会把下一位记录为当前数字.
这样一直进行,直到search的一参数>=一开始读入的数字个数c,则输出,然后返回.返回时,把之前占领的所有格子回溯,以便下一次搜索.
但是考虑到重复情况,每次输出前,用一个单独的子程序来判断是否有重复,如果有则不输出,没有则输出并记录.
因为题目数据范围(0