コード:
#include <stdio.h>
/*
程序描述:
输出字符串所有的组合情况
使用permutation函数进行将指定的下标值,与最大下标值这个范围的每个下标值进行交换
每调用一次permutation函数表示只处理指定下标的值,每次指定位置交换后,再调用b+1
进行后面一个位置的交换,直到要交换的位置的与最大下标值相等时,表示没得交换了
输出该字符串,这次的函数出栈返回调用处(就是处理前一个字符的地方),将前一个位置的
字符恢复回没交换的状态,再将前一个字符与后面字符交换,如果还可以交换就再次调用permutatuion函数
处理后面的字符,要是不可以处理该位置的permutation函数就出栈,返回再前一个位置再进行同样操作
总结:先从第一个字符处理,然后再每个字符调用permutation函数进栈,然后从倒数第二个开始与后面的交换
没得交换后,处理倒数第三个,再回去处理倒数第二个。可以交换就交换,不行就返回处理交换前一个
再回去处理交换后面的。
*/
/*
调换字符函数 (输出所有排列组合)
第一个参数:处理的字符串
第二个参数:要交换的下标在字符串中
第三个参数:可以交换最大值下标(字符串最后一个字符下标)
*/
void permutation(char s[], int b, int e)
{
if( (0 <= b) && (b <= e) )
{
if( b == e )//如果调换的位置与最后一个字符位置相等时输出字符串
{
printf("%s\n", s);
}
else
{
int i = 0;//用于与当前位置(b)做交换的位置
for(i=b; i<=e; i++)//循环将当前位置与后面的每个位置的数据交换(包括自己本身)
{
char c = s[b];//取当前位置的值
s[b] = s[i];//将要交换的值赋给当前位置
s[i] = c;//将当前位置值赋给交换的位置
permutation(s, b+1, e);//将当前位置的下一个位置调用调换字符函数进行下个位置的交换
c = s[b];//将上面当前位置交换后,再交换回来
s[b] = s[i];
s[i] = c;
}
}
}
}
int main()
{
char s[] = "abc";
permutation(s, 0, 2);
getchar();
return 0;
}
分析:
コンパイル: