0昏求助!!大佬帮忙看看萌新错哪了
查看原帖
0昏求助!!大佬帮忙看看萌新错哪了
935299
yashi258楼主2023/2/21 16:44

写了半个多小时,结果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!!

2023/2/21 16:44
加载中...