假设有三个篮筐,分别放入三张牌。每一次放入,手中可使用的牌便少一张,放入的牌用book[i]进行标记,当book[i]=1即为已经使用。收回时book[i]=0,即为已经收回。当走到第四个篮筐时,前三个已经形成一个排列,输出即可。//在一次调用结束时,需要返回上次调用它的地方继续往下执行,直至返回主函数到程序结束
#include<stdio.h>
#include<string.h>
char a[1001011];
char b[1001010];
int book[20010],t;
void dfs(int x)
{
if(x==t+1)//是否已经将字符放置完毕
{
int k;
for(k=1;k<=t;k++)//输出全排列
printf("%c",b[k]);
printf("\n");
return ;
}
int i;
for(i=0; i<t; i++)
{
if(book[a[i]]==0)//判断是否放置
{
b[x]=a[i];//将字母放进b数组里面
book[a[i]]=1;//标记刚刚放过的字符
dfs(x+1);//走到第下一个篮筐前
book[a[i]]=0;//将已放置的字符取出
}
}
}
int main()
{
int i,j,k;
memset(b,'\0',sizeof(b));
memset(book,0,sizeof(book));
scanf("%s",a);
t=strlen(a);
// sort(a,a+t);
dfs(1);
}