题:输入一个小于26的数字n, 代表从字母a开始的一串长度为n的连续字符,如4表示abcd。 请输出这串字符的所有可能排列。
根据提示,补充一个函数int print(int n,char result[][27]),其中n是输入的字符数目,你需要生成全排列,并填写到result数组中。 如果需要,你也可以自己在编辑器中添加子函数。
例:
n=3时 result前6行包含: abc acb bac bca cab cba (提示:result的行次序并不重要,只要是这6个即可)
解析: n个值得全排列数目为n!。第一个位置的可能性是n种,那么一共是n*(n-1)!种,同理依次递推。
int next=0;
char s[27];
int pai(int start, int end, char result[][27]){
if (start >= end) { # 全部遍历后
s[end]=0;
strcpy(result[next], s); # 存入一种可能性
next += 1; # 计数器
} else
for(int i=start; i<end; i++){
char c;
c=s[start];
s[start]=s[i];
s[i]=c;
// swap(s[start], s[i]) # 交换当前位置的可能的值,第一次原地交换,因为当前值的可能性也需要存入
pai(start+1,end,result); # 进入(n-1)的全排列
c=s[start];
s[start]=s[i];
s[i]=c;
// swap(s[start], s[i]); # 换回之前交换的值,以免位置错乱。
}
return 0;
}
int print(int n,char result[][27]){
/*下面填写函数的代码*/
char longstr[]="abcdefghijklmnopqrst";
longstr[n]=0;
strcpy(s, longstr);
pai(0,n, result);
/********结束******/
}
这题是经典的全排列回溯法模板。
|