全排列的问题!!求帮看一下
#include<stdio.h>
#include<stdlib.h>
int res[10];
void perm(int k,int a[]);
void swap(int *a,int *b);
void output(int *list);
void circle_right(int a[],int m,int i);
void circle_left(int a[],int m,int i);
int main(int c,char **v)
{
int i,n;
scanf("%d",&n);
if(c==2)
n=atoi(v[1]);
for (i=0;i<n;i++)
res[i]=i+1;
res[i]=0;
perm(n,res);
}
void perm(int k,int a[])
{
int i;
if(k==1)
{
output(res);
return;
}
for(i=0;i<k;i++)
{
swap(&a[0],&a[i]);
circle_right(a,1,i);
perm(k-1,&a[1]);
circle_left(a,1,i);
swap(&a[i],&a[0]);
}
}
void swap(int *a,int *b)
{
int tmp=*a;
*a=*b;
*b=tmp;
}
void output(int *list)
{
for(;*list!=0;list++)
{
putchar(*list+'0');
putchar(' ');
}
putchar('\n');
}
void circle_right(int a[],int m,int i)
{
int temp;
int j,k;
for(k=1;k<=i-m;k++)
{
temp=a[i];
for(j=i;j>m;j--)
a[j]=a[j-1];
a[m]=temp;
}
}
void circle_left(int a[],int m,int i)
{
int temp;
int j,k;
for(k=1;k<=i-m;k++)
{
temp=a[m];
for(j=m;j<i;j++)
a[j]=a[j+1];
a[i]=temp;
}
}
全排列数的问题 如1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
如果将每行上的输出看成一个数字,则所有输出构成升序数列。
我的问题是输出4的时候就出现了错误,似乎是void circle_right(int a[],int m,int i)和void circle_left(int a[],int m,int i)的问题,具体我不太清楚,求帮助
相关推荐
用回溯法求序列的全排列
c++实现用回溯思想求一个序列的全排列,如输入为{1,2,3},输出{1,2,3},{1,3,2,},{2,1,3},{2,3,1},{3,1,2},{3,2,1}
求字符串的全排列
可以打印出字符串的全排列,代码是C语音风格的,刚学习编程时写的代码
全排列代码,C语言代码,用来解决全排列问题
全排列代码,C语言代码,用来解决全排列问题,csc 认证
使用C语言解决字符串全排列问题
问题 输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba 思路 这是典型的递归求解问题,递归算法有四个特性: 必须有可达到的终止条件,否则程序陷入死循环 子问题在规模上比原问题小 子问题可通过再次递归调用求解 子问题的解应能组合成整个问题的解 对于字符串的排列问题: 如果能生成n-1个元素的全排列,就能生成n个元素的全排列。对于只有一个元素的集合,可以直接生成全排列。所以全排列的递归终止条件很明确,只有一个元素时。我们可以分析一下全排
全排列问题(详细介绍加图解)
全排列算法(详细介绍图解) 1.全排列的定义 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。 2.解决全排列的方法 如求[A,B,C]的全排列 首先保持A不变,对[B,C]进行全排列,同样的,我们先保持B不变,对[C]求全排列,由于C只有一个,它的排列只有一种: C .然后输出得到[A,B,C] 接下来[B,C]不能以B开头了,B,C交换位置(即C,B),求B的全排列,输出得到[A,C,B] 即 [A,B,C]= =>A,[B,C]= =>A,B,[C] 交换B,C = =>A,C,


