/*
* 几种排列组合的算法
*/
#include<stdio.h>
int a[20];
int n;
//打印数组
void showArray(int *a)
{
int i;
for(i=1;i<=n;i++)
printf("%d",a[i]);
printf("\n");
}
//翻转法
void overturn()
{
int i,temp,temp1,temp2,j;
int b[20];
for(i=1;i<=n;i++)
*(b+n-i+1)=*(a+i);
showArray(b);
for(i=1;i<=n;i++){
//判断第一个数是否为1
if(i==1 && b[i]!=i){
temp=b[i];
for(j=1;j<n;j++)
b[j]=b[j+1];
b[j]=temp;
showArray(b);
i=0;
continue;
}
//判断第二个数是否为1
if(i==2 && b[i]!=i){
temp1=b[i];
temp2=b[i-1];
for(j=1;j+2<=n;j++)
b[j]=b[j+2];
b[j]=temp1;
b[j+1]=temp2;
showArray(b);
i=0;
continue;
}
//判断第三个数是否为1
if(i==3 && b[i]!=i){
temp=b[i];
temp1=b[i-1];
temp2=b[i-2];
for(j=1;j+3<=n;j++)
b[j]=b[j+3];
b[j++]=temp;
b[j++]=temp1;
b[j]=temp2;
showArray(b);
i=0;
continue;
}
}
}
//换位法
void changeSite()
{
int i,temp,temp1;
int b[20],max=0;
int dir[20]={-1,-1,-1,-1,-1,-1};
for(i=1;i<=n;i++)
*(b+i)=*(a+i);
showArray(b);
while(1){
max=0;
b[max]=0;
//寻找最大的活结点
for(i=1;i<=n;i++){
if(i+dir[i]>0 && i+dir[i]<=n && b[i]>b[i+dir[i]])
max=b[i]>b[max]?i:max;
}
if(max==0)
break;
//交换位置和方向
temp=b[max];
b[max]=b[max+dir[max]];
b[max+dir[max]]=temp;
temp1=dir[max+dir[max]];
dir[max+dir[max]]=dir[max];
dir[max]=temp1;
//改变比活结点大的数的方向
for(i=1;i<=n;i++)
if(b[i]>temp)
dir[i]=-dir[i];
showArray(b);
}
}
//序数法(排出的序列为有序的)
//str:待排序的字符序列 n:首字符下标 len:字符串长度
void ordinal(char * str,int n,int len)
{
int i;
char temp;
if(n==len)
puts(str);
for(i=n;i<len;i++){
temp=str[i];
str[i]=str[n];
str[n]=temp;
ordinal(str,n+1,len);
temp=str[i];
str[i]=str[n];
str[n]=temp;
}
}
void main()
{
int i;
char str[20];
for(i=1;i<=4;i++)
a[i]=i;
a[0]=n=4;
printf("对1234这四个数进行全排列\n");
printf("翻转法:\n");
overturn();
printf("换位法:\n");
changeSite();
printf("序数法:\n");
for(i=0;i<n;i++)
str[i]=a[i+1]+'0';
str[i]=0;
ordinal(str,0,n);
}
分享到:
相关推荐
文件名“c_N_array.doc”可能是一个文档,详细解释了这个C语言实现的全排列算法。其中可能包含了代码示例,讲解了如何使用数组来存储和生成全排列,也可能讨论了算法的时间复杂度和空间复杂度。 另一份文件“c4.txt...
总结起来,全排列算法的实现主要涉及到以下几个关键点: 1. 递归思想的应用,将大问题分解为小问题。 2. 数组操作,包括元素的交换和遍历。 3. 指针的使用,通过指针交换变量的值。 4. 递归函数的设计,包括基本情况...
根据给定文件的信息,我们可以将涉及的算法知识点分为以下几部分进行详细说明: ### 一、数论算法 #### 1. 最大公约数 (GCD) - **定义**: 给定两个正整数 `a` 和 `b`,最大公约数是能够同时整除它们的最大正整数。...
在学习全排列算法时,还要注意以下几点: - 空间复杂度:全排列算法通常需要O(n)的空间,因为需要存储当前的排列状态。 - 时间复杂度:全排列的时间复杂度是O(n!),因为对于n个不同的元素,有n!种排列方式。 - 回溯...
根据给定的信息,本文将详细解释“n阶行列式计算 C语言实现”的核心知识点,包括如何使用C语言来实现n阶行列式的计算方法,并对代码中的关键部分进行深入解析。 ### 一、n阶行列式的定义与计算原理 在数学中,行列...
**全排列算法思路**: 1. **递归**:首先,从数组的第一个元素开始,将它与剩余元素进行排列,然后对剩余元素递归进行全排列。 2. **回溯**:在递归过程中,当处理到某一层时,如果发现当前的排列不符合全排列的...
【C语言经典算法100例】中包含的是一系列基于C语言的编程问题和解决方案,涉及基础的算法设计和实现。以下是对其中几个程序的详细解析: **程序1**: 该程序的目标是生成所有互不相同且无重复数字的三位数。它使用...
### ACM/ICPC算法大全(C语言)知识点概览 #### 图论(Graph Theory) ... - 介绍了几种常见的取石子游戏规则及解法。 - **集合划分问题** - 如何将一个集合划分为若干个子集。 - **大数平方根(字符串数组...
### C语言原程序二十四点游戏的编程思路与基本算法 #### 一、二十四点游戏简介 二十四点游戏是一种数学益智游戏,玩家需要利用给定的四张牌(每张牌上的数字范围一般为1至13),通过加、减、乘、除四种运算(可以...
以下是一个简单的C语言实现全排列的递归示例: ```c #include void permute(int arr[], int start, int end) { if (start == end) { for (int i = 0; i ; ++i) { printf("%d ", arr[i]); } printf("\n"); }...
C语言是一种强大的、面向过程的编程语言,尤其适合系统编程和嵌入式编程。初学者可以通过各种实例来学习C语言的基础概念,如变量、数据类型、运算符、控制结构(如if语句和循环)、函数、数组、指针等。 在给定的...
例如,可能需要通过算法判断一组数的全排列是否存在于另一组数的序列中。这要求掌握一些基本的算法知识,如排序算法、搜索算法等。 6. 文件的组织结构:题目描述中提到输入由若干个块组成,每个块代表一列火车,每...
最后一个代码片段提供了一个简单的三数排序算法,它通过比较和交换操作,实现了将三个输入数字按从小到大的顺序排列。这里使用了临时变量`t`来进行值的交换,展示了基本的排序逻辑和变量管理技巧。 以上五个知识点...
编写C语言代码时,注意以下几点: 1. 初始化数组:创建一个足够大的数组来存储当前的排列。 2. 使用递归函数:定义一个函数,接受数组、已使用的数字数量和剩余的数字数量作为参数。 3. 检查基本情况:当所有数字都...
根据给定文件的信息,我们可以提炼出以下几个核心知识点: ### 1. 目标读者与应用场景 - **目标读者**:本书主要面向准备去北美或国内求职的程序员,以及初次接触ACM算法竞赛的新手。 - **应用场景**:适用于求职...
C语言是一种广泛应用的高级编程语言,尤其适合系统编程、嵌入式编程以及编写高性能的应用程序。在C语言编程中,理解基础语法、逻辑控制和算法设计是至关重要的。 【程序1】是关于组合排列的问题。程序通过三重循环...
试着设计一个算法,列出R的所有不同排列。 即,给定n以及待排的n个可能重复的元素。计算输出n个元素的所有不同排列。 输入格式 第1行是元素个数n,1。接下来的1行是待排列的n个元素,元素中间不要加空格。 ...