数组全排列c语言实现
来源:互联网 发布:手持云台 知乎 编辑:程序博客网 时间:2024/05/16 15:53
问题出自linux C 一站式编程网站,定义一个数组,编程打印它的全排列
程序的主要思路是:
1.把第1个数换到最前面来(本来就在最前面),准备打印1xx,再对后两个数2和3做全排列。
2.把第2个数换到最前面来,准备打印2xx,再对后两个数1和3做全排列。
3.把第3个数换到最前面来,准备打印3xx,再对后两个数1和2做全排列。
可见这是一个递归的过程,把对整个序列做全排列的问题归结为对它的子序列做全排列的问题,注意我没有描述Base Case怎么处理,你需要自己想。你的程序要具有通用性,如果改变了N和数组a的定义(比如改成4个数的数组),其它代码不需要修改就可以做4个数的全排列(共24种排列)。
解题过程:
1.当N = 1的时候,则直接打印数列即可。
2.当N = 2的时候,设数组为 [a, b]
3.当N = 3的时候,数组为 [a, b, c]
3.1把a放在 a[0] 的位置(原本也是如此,a[0] = a[0]),打印b,c的全排列(即a[1], a[2]的全排列)
3.2把b放在a[0]的位置(这时候需要交换原数组的a[0]和a[1]),然后打印a, c的全排列,打印完后再换回原来的位置,即a还是恢复到a[0],b还恢复到a[1]的位置
至此,全排列完成
当 N = 4,5,6,……的时候,以此类推。
程序代码:
#include <stdio.h>#define N 3 int a[N];void perm(int);void print();void swap(int, int); int main(){ int i,n; int offset; for(i = 0; i<N; i++) a[i] = i + 97; perm(0);} void perm(int offset){ int i, temp; if(offset == N-1) { print(); return; } for(i = offset; i < N; i++) { swap(i, offset); perm(offset + 1); swap(i, offset); }} void print(){ int i; for(i = 0; i < N; i++) printf(" %c ",a[i]); printf("\n");} void swap(int i, int offset){ int temp; temp = a[offset]; a[offset] = a[i]; a[i] = temp;}
- 数组全排列c语言实现
- 数组全排列c语言实现
- 全排列C语言实现
- C语言实现全排列
- C语言实现全排列
- C语言实现全排列
- 全排列 递归实现 c 语言实现
- c 语言实现全排列和组合
- C语言实现全排列算法
- 字符串全排列 C语言实现
- C语言实现的全排列算法
- c语言编程实现数字全排列
- c语言实现全排列一
- C语言全排列算法实现
- 全排列 (C语言实现)
- C语言实现的全排列算法
- C语言递归实现全排列
- C语言全排列
- linux sort -k
- comment on的重要意义
- linux tr
- 等值首尾和问题
- 怎样花两月时间去应聘互联网公司
- 数组全排列c语言实现
- Linux下生产者消费者问题详细分析(操作系统期中考试论文---并发程序的同步和互斥)
- jQuery 自定义函数方法
- 调查:你目前使用的QTP版本是多少?
- 黑马程序员—Java高新技术2
- 现代软件工程讲义 4 方法论 - 事后诸葛亮会议
- linux平台下 延迟工作队列实例
- zoj 2857 Image Transformation
- RHEL AS4 上oracle10gR2 静默安装