思路
运用递归的思路,第一位具有N种情况,接着在第一位确定后,第二位有N-1种情况,再接着第二位确定后,第三位有N-2种情况等…
例:输入1 2 3。
输出1-2-3。
1-3-2。
2-1-3。
2-3-1。
3-1-2。
3-2-1。
规律:有n个数的条件下,每个数都会在第一位(n-1)次。这里用一个for循环就行。
再对他们后面数进行全排列。这就形成递归。
递归函数:
输入:数组,左边,右边。
递归结束的条件:当左边等于右边,完成排列,可以进行其他操作。
主体:for(从左到右进行操作){
将list[左边]<–>list[i];
递归(数组,左边+1,右边);
将数组换回来list[左边]<–>list[i];
}
源代码
#include<stdio.h>
#include<stdlib.h>
int input(int[]);
//输入数组,并返回数组元素个数。
int input(int nums[])
{
int i;
char c = '0';
for (i = 0; c != '\n'; i++)
{
scanf_s("%d", &nums[i]);
c = getchar();
}
return i;
}
void QuanPaiLie(int[],int,int);
//递归,将最后一个放入前n-1个的全排列。以此类推。
//p,最后一个数。q,“龙头”后的数。
void QuanPaiLie(int nums[],int p,int q)
{
int i,temp;
//递归的结束条件。最后只有一个数,它的全排列就是他自己。
if (p == q)
{
for (i = 0; i <= q; i++)
{
printf("%d-", nums[i]);
}
printf("\n");
}
else
{
//每个数都当一次该全排列的“龙头”。
for (i = p; i <= q; i++)
{
//将那个数交换该排列的到“龙头”。
temp = nums[i];
nums[i] = nums[p];
nums[p] = temp;
//将“龙头”的后面再进行全排列
QuanPaiLie(nums, p + 1, q);
//用完要换回来。
temp = nums[i];
nums[i] = nums[p];
nums[p] = temp;
}
}
}
int main()
{
int nums[999], num;
num = input(nums);
QuanPaiLie(nums,0,num-1);
system("pause");
return 0;
}
#include<iostream>
using namespace std;
#include<string>
void fun(string &str, int left, int right){
if (left == right){
cout << str << endl;
}
else{
for (int i = left; i <= right; i++){//最后一个元素也要换
int temp;
//将那个数交换该排列的到“龙头”。
temp = str[i];
str[i] = str[left];
str[left] = temp;
//将“龙头”的后面再进行全排列
fun(str, left + 1, right);
//用完要换回来。
temp = str[i];
str[i] = str[left];
str[left] = temp;
}
}
}
int main(){
string str;
cin >> str;
fun(str, 0, str.length() - 1);
system("pause");
return 0;
}