这段代码是一个实现全排列的程序。它使用了递归的思想,通过不断交换数组中的元素来生成所有可能的排列。具体的实现过程如下:
首先定义了两个辅助函数swap和swapback,用于交换数组中的元素。swap函数将数组中p和q位置的元素交换,并将p位置后的元素向后移动一位;swapback函数将数组中p和q位置的元素交换,并将p位置后的元素向前移动一位。
定义了一个打印数组的函数printfarr,用于输出数组中的元素。
.定义了一个递归函数perm,用于生成所有可能的排列。它的参数包括数组a、当前处理的起始位置p和结束位置q。当p等于q时,表示已经到达了数组的最后一个元素,此时调用printfarr函数输出当前的排列。否则,从p到q的位置依次交换元素,并递归调用perm函数,然后再将元素交换回来,以便进行下一次交换。
在主函数中,定义了一个数组a,并从用户输入中获取了一个整数n。然后调用perm函数生成数组a的所有可能排列
#define _CRT_SECURE_NO_WARNINGS // 预处理指令,用于忽略安全警告 #include <stdio.h> // 包含标准输入输出库函数 #include <string.h> // 包含字符串处理库函数 // 定义一个函数,用于交换数组中的两个元素 void swap(int a[], int p, int q) { int temp = a[q]; // 将第q个元素保存在临时变量temp中 for (int i = q; i >= p + 1; i--) // 从q开始,逐个向前移动元素 { a[i] = a[i - 1]; // 将前一个元素赋值给当前元素 } a[p] = temp; // 将保存的第q个元素放入位置p } // 定义一个函数,用于将数组中的某个元素移动到后面 void swapback(int a[], int p, int q) { int temp = a[p]; // 将第p个元素保存在临时变量temp中 for (int i = p; i <= q - 1; i++) // 从p开始,逐个向后移动元素 { a[i] = a[i + 1]; // 将后一个元素赋值给当前元素 } a[q] = temp; // 将保存的第p个元素放入位置q } // 定义一个函数,用于打印数组中的元素 void printfarr(int a[], int n) { for (int i = 0; i < n; i++) // 循环遍历数组中的元素 { printf("%d ", a[i]); // 打印数组中的元素 } printf("\n"); // 打印换行符 } // 定义一个函数,用于对数组进行全排列 void perm(int a[], int p, int q) { if (p == q) // 当p等于q时,表示已经完成了一种排列方式 { printfarr(a, q + 1); // 调用打印数组的函数,打印当前排列方式 } for (int i = p; i <= q; i++) // 循环遍历数组中的元素 { swap(a, p, i); // 将第i个元素与第p个元素交换 perm(a, p + 1, q); // 递归调用perm函数,对剩余的元素进行全排列 swapback(a, p, i); // 将第i个元素与第p个元素交换回来 } } int main() { int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 定义一个数组a,包含10个元素 int n; // 定义一个变量n,用于存储用户输入的值 scanf("%d", &n); // 从用户输入中读取一个整数,并将其赋值给变量n perm(a, 0, n - 1); // 调用perm函数,对数组a中的元素进行全排列 return 0; // 返回0,表示程序正常结束 }
0.0分
1 人评分