Description
輸入一個整數 n(1 <= n <= 8), 輸出1,2,3...n 的全排列
Input
3
Output
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
Hint
輸出的順序按第一個數從小到大排列,若第一個數相同,則按第二個數排列,以此類推。使用遞歸
法一:
#include <stdio.h>
int n;
int ary[9];
void swapAry(int x, int y);
void printAry();
void sortAry(int from, int to);
void func(int from, int to);
void store(int to[], int from[]);
int main(int argc, char const *argv[])
{
scanf("%d", &n);
for (int i = 1; i <= n; ++ i)
{
ary[i] = i;
}
func(1, n);
return 0;
}
void swapAry(int x, int y)
{
int temp = ary[x];
ary[x] = ary[y];
ary[y] = temp;
}
void printAry()
{
for (int i = 1; i < n; ++ i)
{
printf("%d ", ary[i]);
}
printf("%d\n", ary[n]);
}
void sortAry(int from, int to)
{
int allRight;
for (int i = from; i < to; ++ i)
{
allRight = 1;
for (int j = from; j < to + from - i; ++ j)
{
if (ary[j] > ary[j + 1])
{
swapAry(j, j + 1);
allRight = 0;
}
}
if (allRight)
break;
}
}
void store(int to[], int from[])
{
for (int i = 1; i <= n; ++ i)
to[i] = from[i];
}
void func(int from, int to)
{
if (from == to)
{
printAry();
}
else
{
sortAry(from, to);
for (int i = from; i <= to; ++ i)
{
int temp[9];
store(temp, ary);
swapAry(i, from);
func(from + 1, to);
store(ary, temp);
}
}
}
法二:#include <stdio.h>
int ary[9];
int n;
int next();
int main(int argc, char const *argv[])
{
scanf("%d", &n);
for (int i = 1; i <= n; ++ i)
{
ary[i] = i;
}
do
{
for (int i = 1; i < n; ++ i)
printf("%d ", ary[i]);
printf("%d\n", ary[n]);
} while(next());
return 0;
}
int next()
{
for (int i = n; i > 1; -- i)
{
if (ary[i - 1] < ary[i])
{
int min = i;
for (int j = i + 1; j <= n; ++ j)
{
if (ary[j] > ary[i - 1])
min = j;
else
break;
}
int temp = ary[min];
ary[min] = ary[i - 1];
ary[i - 1] = temp;
for (int j = i, k = n; j < k; ++ j, -- k)
{
temp = ary[j];
ary[j] = ary[k];
ary[k] = temp;
}
return 1;
}
}
return 0;
}