全排列的问题!!求帮看一下

「已注销」 2011-05-26 01:03:41
#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)的问题,具体我不太清楚,求帮助
...全文
69 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2011-05-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yq_118 的回复:]

C/C++ code
#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_lef……
[/Quote]
能不能具体解释一下 我不太明白
CrackValue 2011-05-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yq_118 的回复:]

合格的程序员应该会使用gdb,indent这类工具。
[/Quote]
我是菜鸟,和3楼的目的一样
这两个工具我一个也不会用,哎呀,完蛋了
AnYidan 2011-05-26
  • 打赏
  • 举报
回复
接分...
stein42 2011-05-26
  • 打赏
  • 举报
回复
合格的程序员应该会使用gdb,indent这类工具。
stein42 2011-05-26
  • 打赏
  • 举报
回复
#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);
return 0;
}

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[j] = temp; // 左边改为a[j]
//}
}

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[j] = temp; // 同上
//}
}

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧