c语言全排列(给个简单点的程序,网上的我简直看晕了)

作者&投稿:步鲁 (若有异议请与网页底部的电邮联系)
c语言全排列问题 将a,b,c,d,e,f,g,h全排列,并将全排列存放在一个二维数组中,需要完整源程序,急!!~

给你一个三个字母全排列的代码
#include
#include

void main()
{
char x,y,z;/*保存要全排列的字母*/
char a[6][3];/*6是3! */
int i=0;
/*要全排列多少字母就进行多少次循环[效率有些低]*/
for(x='a';x<='c';x++)
for(y='a';y<='c';y++)
for(z='a';z<='c';z++)
{
if(x!=y && x!=z && y!=z)/*排除有相等的情况*/
{
a[i][0]=x;
a[i][1]=y;
a[i][2]=z;
i++;
}
}
system("pause");
}

首先,我下面的叙述是建立在楼主明白什么是递归调用的基础上的。对递归毫无了解的话,请先看看百度百科。
然后,进入正题。

第一个return:就是返回这个函数的调用者,这个函数执行完毕。这是一个if判断,当带排列的数列长度为1时,只有一种可能,输出,则排列结束,返回。长度不只1的时候,执行以下for。

未完待续

接着讲这个
for(i=0;i<n;i++){----------这个循环到底怎么个看法和顺序?
anagram(d,n-1); 怎么输出的??(这块都不明白)
temp=d[0];
for(j=1;j<=n-1;j++){
d[j-1]=d[j];

}
d[n-1]=temp;

}


先讲这个算法的思想,比如对abc进行全排列,那么可以看做:ab的全排列+c和ac的全排列+b和bc的全排列+a三个的组合。然后再细化,ab的全排列可以看出a的全排列+b,和b的全排列+a两个的组合。当只有一个时,就是调用if=1的那个情况,直接print。不是1的时候,就是递归调用,进行不断地分解。

这是算法思想,未完待续

两个for循环,里面的for执行一边后就是把数组的元素挨个往前挪一位,第一位到最后位,然后对前n-1位进行全排列,递归进行。从上面的算法思想中我们可以看出这样的目的和意义,就是一个类似对上面abc的分解过程,一次a到最后排bc,一次b到最后排ac,一次c到最后排ab。


就先说这么多吧。纯手打,望采纳!有问题可以补充,或者百度hi我。


我帮你改了一下代码,加了几行printf,希望可以解决你的那几个问题:

#include
#define NUM 3
void anagram(int[],int);
void print(int[]);
void main()
{
int d[NUM];
int i;
for(i=0;i<NUM;i++)
d[i]=i + 1;
printf("初始化后的数组顺序是:");
print(d);

anagram(d,NUM);
}
void anagram(int d[],int n)
{
int i,j,temp;
int p;
if(n==1){
print(d); //打印函数
return;//-------------return返回哪?
} // 和下面的for怎么联系起来?


for(i=0;i<n;i++){//----------这个循环到底怎么个看法和顺序?
printf("
i = %d,n = %d, 准备调用aragram(d,%d)
",i,n,n-1);
printf("这时候的数组顺序是:");
print(d);
anagram(d,n-1); // 怎么输出的??(这块都不明白)
temp=d[0];
for(j=1;j<=n-1;j++){
d[j-1]=d[j];

}
d[n-1]=temp;

}
}
void print(int d[]){
int i;

for(i=0;i<NUM;i++){
printf("%d",d[i]);
}

printf("
");

}


PS:
改动:1、print函数原来是逆序输出,改成正序输出,有利于理解;2、数组原来初始化为321,改为123,有利于理解。就改了这两个地方,加了一些printf。

你可以运行一下。

输出结果:
初始化后的数组顺序是:123

i = 0,n = 3, 准备调用aragram(d,2)
这时候的数组顺序是:123

i = 0,n = 2, 准备调用aragram(d,1)
这时候的数组顺序是:123
123

i = 1,n = 2, 准备调用aragram(d,1)
这时候的数组顺序是:213
213

i = 1,n = 3, 准备调用aragram(d,2)
这时候的数组顺序是:231

i = 0,n = 2, 准备调用aragram(d,1)
这时候的数组顺序是:231
231

i = 1,n = 2, 准备调用aragram(d,1)
这时候的数组顺序是:321
321

i = 2,n = 3, 准备调用aragram(d,2)
这时候的数组顺序是:312

i = 0,n = 2, 准备调用aragram(d,1)
这时候的数组顺序是:312
312

i = 1,n = 2, 准备调用aragram(d,1)
这时候的数组顺序是:132
132
请按任意键继续. . .

//以下为代码文件,思路就是交换数字,递归

  #include <stdio.h>

  int n = 1;

  int ans[1000];

  void swap(int *a, int *b)

  {

  int m;

  m = *a;

  *a = *b;

  *b = m;

  }

  void perm(int list[], int k, int m)

  {

  int i,tmp=0;

  if(k > m)

  {

  for(i = 0; i <= m; i++)

  {

  tmp=tmp*10+list[i];

  

  }

  ans[n]=tmp;

  n++;

  }

  else

  {

  for(i = k; i <= m; i++)

  {

  swap(&list[k], &list[i]);

  perm(list, k + 1, m);

  }

  }

  }

  int main()

  {

  int list[] = {1, 2, 3};

  int i;

  perm(list, 0, 2);

  for(i=1;i<n;i++)printf("%d
",ans[i]);

  return 0;

  }



要带顺序的吗?如果带顺序,程序就比较麻烦


c语言全排列
1、首先看最后两个数4, 5。 它们的全排列为4 5和5 4, 即以4开头的5的全排列和以5开头的4的全排列。由于一个数的全排列就是其本身,从而得到以上结果。2、再看后三个数3, 4, 5。它们的全排列为3 4 5、3 5 4、 4 3 5、 4 5 3、 5 3 4、 5 4 3 六组数。即以3开头的和4...

求13个数的C语言全排列算法
{ \/\/升序,选择排序法,第一趟,找出最小的放到最前面,第二趟从n-1里找最小的方第二个上,依次类推是为选择 int a[n];int j,i,p,t;printf("请输入你要排序的数字:\\n");for(i=0;i<n;i++)scanf("%d",&a[i]);printf("---冒泡排序结果---\\n");for(i=0;i<n-1;i...

c语言全排列
下面这个程序读取一行字符串,然后对该字符串中的所有字符进行全排列输出 注:输入的字符串不要太长,因为不存在能够在短时间内输出全排列的算法 include <stdio.h> include <string.h> include <memory.h> int m;\/\/记录字符串长度 int n;\/\/记录字符串中的字符种类数 char map[256];\/\/记录是哪...

C语言如何实现有重复元素的全排列?
在递归里面用交换的方式获取全排列,从第一个开始,不断与后面数交换,当然递归时不要忘记在后面写个换回来的语句。只要加个交换条件就可以了,在不相等时交换,相等时不交换。当前阶段,在编程领域中,C语言的运用非常之多,它兼顾了高级语言和汇编语言的优点,相较于其它编程语言具有较大优势。计算机...

一个C语言全排列的算法。 比如,输入3,则将123的全排列全部输出:123...
include main(){ int a1,a2,a3,a4,a5,a6,a7,a8,a9,n,t=0;scanf("%d",&n);for(a1=1;a1<=n;a1++)if(n==1){printf("%d\\n",a1);t=t+1;} else for (a2=1;a2<=n;a2++)if(a2!=a1){if(n==2) {printf("%d%d\\n",a1,a2);t=t+1;} else for (a3=1;a3<=n;a3+...

C语言怎么实现有重复元素的全排列?
void swap(char *x, char *y) { \/\/ 交换两个字符变量的内容 char ch = *x;x = *y;y = ch;} void perm(char *s, int n, int idx) { \/\/ 回溯产生字符串全排列 if (idx == n) { \/\/ 已排列到字符串结尾 res[num] = (char *)malloc(sizeof(char) * (n + 1));\/\/...

c语言全排列问题 将a,b,c,d,e,f,g,h全排列,并将全排列存放在一个二维...
给你一个三个字母全排列的代码 include <stdio.h> include <stdlib.h> void main(){ char x,y,z;\/*保存要全排列的字母*\/ char a[6][3];\/*6是3! *\/ int i=0;\/*要全排列多少字母就进行多少次循环[效率有些低]*\/ for(x='a';x<='c';x++)for(y='a';y<='c';y++)for(...

关于全排列的算法问题
本文主要通过对全排列以及相关算法的介绍和讲解、分析,让读者更好地了解这一方面的知识,主要涉及到的语言是C和C++。本文的节数:1.全排列的定义和公式:2.时间复杂度:3.列出全排列的初始思想:4.从第m个元素到第n个元素的全排列的算法:5.全排列算法:6.全排列的字典序:7.求下一个字典序...

C语言将ABCD全排列 应该怎么写?
四个字母,全排列,则建立四重循环,当四个循环变量互不相同时,输出四个循环变量值,即可得结果!

...用c语言实现1,5,6,11,14,15,16,18,19的全排列,并且要求14要在11...
int fun(int s[]);int max(int p,int q);for(a=0; a<9;a++)for(b=0; b<9;b++)for(c=max(a,b)+1;c<9;c++)for(d=0; d<9;d++)for(e=d+1; e<9;e++)for(f=0; f<9;f++)for(g=0; g<9;g++)for(h=g+1; h<9;h++)for(i=max(e,...

金溪县13559115726: 比较简洁的能够让输入的数据按照从大到小顺序排列的C语言程序 跪求大神帮忙.. -
柯祥菲讯: #include <stdio.h>#define N 10 int main() { int num[N]; int i, j; int temp; printf("请输入%d个整数: ", N); for (i = 0; i < N; ++i) { scanf("%d", &num[i]); } for (i = 0; i < N - 1; ++i) { for (j = i + 1; j < N; ++j) { if (num[i] < num[j]) { temp = num[i]; num[i] =...

金溪县13559115726: 急!!!如何用C语言编写打出1~n个数的全排. -
柯祥菲讯: 递归,比较简单,10个数全排如下#include<stdio.h> void swap(int k,int i,int a[]) { int t; t=a[k]; a[k]=a[i]; a[i]=t; } void pailie(int a[],int i,int n) {int k,t; if(i==n) { for(t=0;t<n;t++) printf("%3d",a[t]); printf("\n"); } elsefor(k=i;k<n;k++) { swap(i,k,a); pailie(a...

金溪县13559115726: 一个C语言全排列的算法. 比如,输入3,则将123的全排列全部输出:123,132,213,231 -
柯祥菲讯: #include main() { int a1,a2,a3,a4,a5,a6,a7,a8,a9,n,t=0; scanf("%d",&n); for(a1=1;a1<=n;a1++) if(n==1){printf("%d\n",a1);t=t+1;}else for (a2=1;a2<=n;a2++)if(a2!=a1) {if(n==2) {printf("%d%d\n",a1,a2);t=t+1;} else for (a3=1;a3<=n;a3++)if(...

金溪县13559115726: c语言求全排列 -
柯祥菲讯: 用迭代算法简单些, 就是速度慢许.算法为: 为求1 ~ n个整数的函数 permutation, * 如果n = 2, 只有两种排列方式, 即 (1, 2) (2, 1)* 迭代计算1 ~ n-1个整数的全排列* 将n插入所得到的1 ~ n-1的全排列的任意位置得到1 ~ n的全排列.

金溪县13559115726: 如何用C语言编写1234的全排列 -
柯祥菲讯: #include <stdio.h> void main() {int i=0,j=0,k=0,l=0,count=0;for(i=1;i<=4;i++){for(j=1;j<=4;j++)if(j!=i)for(k=1;k<=4;k++)if(k!=i&&k!=j)for(l=1;l<=4;l++)if(l!=i&&l!=j&&l!=k){ count++;printf("\n\t第%2d个 %d %d %d %d",count,i,j,k,l);}}putchar('\n'); }

金溪县13559115726: C语言题,输出全排列,写下简单代码,要让初学者看懂 -
柯祥菲讯: 我给你举两个简单的列子:题目:输入三个整数x,y,z,请把这三个数由小到大输出. 1.程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换,然后再用x与z进行比较,如果x>z则将x与z的值进行交换,这...

金溪县13559115726: C语言实现可设置位数26个字母m选n全排 -
柯祥菲讯: #include int count=0;// 此处可添加file *fp;int Check(char x ,char alp[26])// 判断是否重复出现 { for(int n=0; n if(alp[n]==x && alp[n]!=0 ) return 1; return 0; }void Fun(int m,int n,char temp[26],char alp[26] )// 函数递归构造符合要求的字符串 { int num=...

金溪县13559115726: 用c语言实现 ABCDE按照全排列输出所有结果 -
柯祥菲讯: #include <stdio.h> #include <stdlib.h> void main() {char i,j,k,m,n;for(i='A';i<='E';i++)for(j='A';j<='E';j++)for(k='A';k<='E';k++)for(m='A';m<='E';m++)for(n='A';n<='E';n++)if(i!=j&&i!=k&&i!=m&&i!=n&&j!=k&&j!=m&&j!=n&&k!=m&&k!=n&&m!=n)...

金溪县13559115726: C语言中《计算出n个整数的全排列种数,并输出这所有的排列》怎样写?求大神帮助!!!!! -
柯祥菲讯: 源程序如下:#include <stdio.h> #include <string.h> char string[9]="12345678"; int used[9]={0}; char output[9]; int length; void F(int d) {int i;for(i=0;i<=length;i++){if(!used[i]){used[i]=1;output[d]=string[i];if(d==length){for(d=0;d<length;d++)...

金溪县13559115726: c语言 给出一个数怎样输出该数的全排列 -
柯祥菲讯: 递归法:设输入的数为n,N={1,2,...n} 不断选择数字i,把i从N中剔除,直到N为空集即可 代码如下:#include <stdio.h>#include <stdlib.h>#include <string.h> int N; bool *mark; int *output, pos = 0; void AddNumber(int i) {bool finish = true; mark[i] = ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网