写了半个多小时,结果5个WA,绷不住了,,明明答案也都对啊。。
#include<stdio.h>
void swap(int* a, int m, int n)
{
int temp = a[n];
for (int i = n; i > m; i--)
a[i] = a[i - 1];
a[m] = temp;
}
void swapback(int* a, int m, int n)
{
int temp = a[m];
for (int i = m + 1; i <= n; i++)
a[i - 1] = a[i];
a[n] = temp;
}
void arrprint(int* a, int n)
{
for (int i = 0; i < n; i++)
printf("%d", a[i]);
printf("\n");
}
void pexm(int* a, int m, int n)//m表示起点,n表示终点
{
if (m == n)
arrprint(a, n );
//先将1放在第一个位置,后边的数字进行全排列
//然后把2和1交换(准确来说应该是把2提到最前面,然后2以前的数字整体向右移动一个单位!)
else
{
for (int i = m; i < n; i++)//i表示与第一个元素交换的元素的下标
{
swap(a, m, i);
//上述可以表示1,2,3……n分别占领第一位的情况,下面对其后的数组进行全排列
//下面这里用到递归的思想,即同样用swap函数,从m+1开始
//【此时m+1是作为新的m传参,相当于每次进行递归都是从下一个元素开始排序】
pexm(a, m + 1, n);
//接着要把原本交换的两个元素给换过来??不然会出现问题
//例如,原本为1234,交换12,变为2134,如果不换回来,下一次结果将为3124【理论期望应为3214】??
//这里不是很明白,总之需要swapback
//此处进行打印输出
swapback(a, m, i);//将下表小于等于i的所有元素【m除外】向左移动一个单位,然后m处元素归还i;
}
}
}
int main()
{
int a[10] = { 0 };
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
a[i] = i + 1;
pexm(a, 0, n);
return 0;
}
中间注释是写的时候整理思路用的,大佬轻喷,跪谢orz!!