2016.10.19
【题目描述】
穷举所有排列
时限:100ms 内存限制:10000K 总时限:300ms
描述:
输入一个小于10的正整数n,按把每个元素都交换到最前面一次的方法,输出前n个小写字母的所有排列。
输入:
输入一个小于10的正整数n。
输出:
按把每个元素都交换到最前面一次的方法,输出前n个小写字母的所有排列。
输入样例:
3
输出样例:
abcacbbacbcacbacab
【解题思路】
使用回溯的思想,生成n个数的所有排列。
当程序执行到第k层时,默认前面的序列已经排好,接下来k与后面的数(包括自己)依次交换位置,进行下一层,结束后恢复状态。
【代码实现】
# include <stdio.h>
int n;
char a[15] = {0,'a','b','c','d','e','f','g','h','i','j','k','l'};
void search(int );
void swap(int ,int );
void output();
int main(void)
{
int i;
scanf("%d", &n);
search(1);
return 0;
}
void search(int k)
{
int i;
if (k == n + 1)
output();
else
{
for (i = k; i <= n; ++i)
{
swap(i, k);
search(k + 1);
swap(i, k);
}
}
}
void swap(int x, int y)
{
int t;
t = a[x];
a[x] = a[y];
a[y] = t;
}
void output()
{
int i;
for (i = 1; i <= n; ++i)
printf("%c", a[i]);
printf("\n");
}
【心得体会】
进一步体会回溯算法