当前位置:首页 » 编程语言 » c语言全排列

c语言全排列

发布时间: 2022-01-09 17:28:36

c语言中全排列问题

//输入一个数输出这个数所有的排列,递归做法

#include<stdio.h>
int a[100];
int n;
void output()
{
int i;
for(i=1;i<=n;i++)
printf("%3d",a[i]);
printf("\n");
}
void Swap(int &a,int &b) //注意取地址
{
int t;
t=a;
a=b;
b=t;
}
void pailie(int t)
{
int i;
if(t==n) //输出
{
output();
return ;
}
for(i=t;i<=n;i++)
{
Swap(a[i],a[t]); //交换
pailie(t+1);
Swap(a[t],a[i]); //换回
}
}
int main()
{
int i;
while(scanf("%d",&n)!=EOF&&n!=0)
{
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
pailie(1);
}
return 0;
}

㈡ C语言的全排列问题!急!

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int hash[27];
char word[201];
int n;
void dfs(int cur)
{
if(cur>=n)
{
printf("%s\n",word);
return ;
}
int i;
for(i=0;i<26;i++)
if(hash[i])
{
hash[i]--;
word[cur]=i+'a';
dfs(cur+1);
hash[i]++;
}
return ;
}
int main()
{
int i;
scanf("%s",word);
n=strlen(word);
memset(hash,0,sizeof(hash));
for(i=0;i<n;i++)
hash[word[i]-'a']++;
dfs(0);
return 0;
}

楼主看一下,输入一行字符,输出全排列,多个案例的话最外面加个while循环就是了

㈢ C语言 全排列······晕

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

第一个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<stdio.h>
#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("\ni = %d,n = %d, 准备调用aragram(d,%d)\n",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("\n");

}

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
请按任意键继续. . .

㈣ 全排列用C语言实现

给,已经编译运行确认:
#include<stdio.h>
#include<string.h>
char a[20];
int lenth;
long count=0;
void main()
{void move(int,int);
int i,j=0;
printf("input:");gets(a);
lenth=strlen(a);
for(i=0;i<lenth;i++)
move(j,i);//move a[i] to the front of a[j];
printf("\ntotal=%d\n",count);
}
void move(int here,int which)//move a[which] to the front of a[here];
{char b[20];
char temp;
int m,n;
if(here<lenth-1)
{if(here!=which)
{for(m=0;m<lenth;m++)
b[m]=a[m];
temp=a[which];
for(m=which;m>here;m--)
a[m]=a[m-1];
a[m]=temp;
}
for(n=here+1;n<lenth;n++)
move(here+1,n);
if(here!=which)
for(m=0;m<lenth;m++)
a[m]=b[m];
}
else
{printf("%-10s",a);
count++;}
}

㈤ c语言求全排列

用迭代算法简单些, 就是速度慢许.

算法为:
为求1 ~ n个整数的函数 permutation,
* 如果n = 2, 只有两种排列方式, 即 (1, 2) (2, 1)
* 迭代计算1 ~ n-1个整数的全排列
* 将n插入所得到的1 ~ n-1的全排列的任意位置得到1 ~ n的全排列.

㈥ C语言全排列问题

你的程序在swap()函数中只是将形参进行了值的对调,对实参无任何影响.
解决上述问题有两个方法:

1.正如楼上所说的,在C++环境下,可以将swap的两个参数改成引用类型,这样对它们的操作将实际作用于实参,实现如下:
函数定义:swap(int &a,int &b);
函数调用示例:swap(*(p+k);*(p+i));其中p是指针,k,i是整形偏移量.

2.在纯C环境下,可以将swap的两个参数改为指针类型,而在函数内部使用对其指向的地址中数据的解引用操作,实现对原变量的对调操作,实现如下:
函数定义:
swap(int *a,int *b)
{int t;
t=*a;
*a=*b;
*b=t;
}
函数调用示例:swap(p+k,p+i);其中p是指针,k,i是整形偏移量.

你的程序中还有两处涉及到指针使用的错误,我把改过的程序贴上来,错误已在注释中标注.

#include "stdio.h"
swap(int *a,int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
perm(int *p,int k,int n)
{
int i;
if(k==n-1)
{
for(i=0;i<n;i++)
printf("%d",*(p+i));
printf("\n");
}
else
{
for(i=k;i<n;i++)
{
swap((p+k),(p+i));
perm(p,k+1,n); //原为perm(*p,k+1,n).在此应传递的是指针p指向的地址,而不是该地址中的内容.
swap((p+k),(p+i));
}
}
}
main()
{
int i,list[3],*p;
for(i=0;i<3;i++)
list[i]=i+1;
p=list; //原为p=list[0].这里应将数组list的首地址赋值给指针p,所以就写成p=list或p=&list[0].
perm(p,0,3);
}

㈦ 求一个c语言按字典序全排列的方法

如果是想学习一下算法,用c语言不错。如果是实际使用需要,就用现成的木头超级字典生成器(MutouDic),工具集里有一个排列字典工具,可以生成任意个元素,任意长度的升序排列、降序排列和全排列。

㈧ c语言中,如何输出一个数组的全排列!如a[3]={1,2,3} 要求输出1 2 3,1 3 2,

#include <stdio.h>
#define N 3
int a[N];
void perm(int);
void print();
void swap(int, int);
int main()r> {
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代码和算法

#include <stdio.h>
#include <string.h>

char string[]="123456789a";
int used[10]={0};
char output[10];
int length;

void Fun(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++)
{
if(output[d]=='a')
printf("10 ");
else printf("%c ",output[d]);
}
if(output[length]=='a')
printf("10\n");
else
printf("%c\n",output[length]);
}
else
Fun(d+1);
used[i]=0;
}
}
}

int main()
{
int n;
scanf("%d",&n);

string[n]=0;
length=strlen(string)-1;

Fun(0);

return 0;
}

㈩ c语言全排列

基本思想是用回溯法来搜索每一种排列
不过楼主对问题的说明不是很详细,所以我只好写个
普适性
比较大的了
下面这个
程序
读取一行
字符串
,然后对该字符串中的所有
字符
进行全排列输出
注:输入的字符串不要太长,因为不存在能够在短时间内输出全排列的
算法
#include
<stdio.h>
#include
<string.h>
#include
<memory.h>
int
m;//记录字符串
长度
int
n;//记录字符串中的字符
种类

char
map[256];//记录是哪几种字符
int
count[256];//记录每种字符有多少个
void
Make_Map(char
*str)//统计字符串的相关信息
{
int
s[256];
int
i;
memset(s,0,sizeof(s));
memset(count,0,sizeof(count));
m=strlen(str);
while(*str)
{
s[*str]++;
str++;
}
n=0;
for
(i=0;i<256;i++)
if
(s[i])
{
map[n]=i;
count[n]=s[i];
n++;
}
}
int
stack[1000];//递归用的栈,并记录当前生成的排列
void
Find(int
depth)//递归式回溯法生成全排列
{
if
(depth==m)
{
int
i;
for
(i=0;i<depth;i++)
putchar(map[stack[i]]);
putchar('\n');
}
else
{
int
i;
for
(i=0;i<n;i++)
if
(count[i])
{
stack[depth]=i;
count[i]--;
Find(depth+1);
count[i]++;
}
}
}
main()
{
char
str[1000];
gets(str);
Make_Map(str);
Find(0);
}

热点内容
支持ftp的免费空间 发布:2025-02-05 16:32:00 浏览:886
python时间比较 发布:2025-02-05 16:31:46 浏览:49
手机银行的密码怎么改密码忘了怎么办啊 发布:2025-02-05 16:02:02 浏览:178
算法牛人左 发布:2025-02-05 15:31:02 浏览:438
php筛选功能 发布:2025-02-05 15:29:09 浏览:167
ip匹配服务器 发布:2025-02-05 15:10:35 浏览:909
php语法后 发布:2025-02-05 15:10:34 浏览:59
oppor9s怎么压缩文件 发布:2025-02-05 15:00:34 浏览:639
苹果耳塞怎么改安卓也能用 发布:2025-02-05 14:50:54 浏览:558
安卓如何鉴别手机真假 发布:2025-02-05 14:28:15 浏览:121