#1
by Serdol » 8年前
現在C言語で、1~10個の任意の数字の入力を受け付け、そこから順列を生成して出力するプログラムを書いております。
ただし出力に際して順番が決まっています。
例えば、
4 7 9 1 3 と入力(最初の数字は個数を表す)すると、
7, 9, 1, 3
7, 9, 3, 1
7, 1, 3, 9
7, 1, 9, 3
7, 3, 9, 1
7, 3, 1, 9
9, 1, 3, 7
9, 1, 7, 3
9, 3, 7, 1
9, 3, 1, 7
9, 7, 1, 3
9, 7, 3, 1
1, 3, 7, 9
1, 3, 9, 7
1, 7, 9, 3
1, 7, 3, 9
1, 9, 3, 7
1, 9, 7, 3
3, 7, 9, 1
3, 7, 1, 9
3, 9, 1, 7
3, 9, 7, 1
3, 1, 7, 9
3, 1, 9, 7
この順番で出力されなくてはなりません。
しかし、今書いているプログラムだと、
7, 9, 1, 3
9, 7, 1, 3
7, 1, 9, 3
1, 7, 9, 3
1, 9, 7, 3
9, 1, 7, 3
7, 9, 3, 1
9, 7, 3, 1
7, 3, 9, 1
3, 7, 9, 1
3, 9, 7, 1
9, 3, 7, 1
7, 3, 1, 9
3, 7, 1, 9
7, 1, 3, 9
1, 7, 3, 9
1, 3, 7, 9
3, 1, 7, 9
3, 9, 1, 7
9, 3, 1, 7
3, 1, 9, 7
1, 3, 9, 7
1, 9, 3, 7
9, 1, 3, 7
このように出力されてしまいます。どのように変更すればよいでしょうか。
そのプログラムは以下の通りです。
非表示エリア
この非表示エリアを表示するには、登録し、ログインする必要があります。
現在C言語で、1~10個の任意の数字の入力を受け付け、そこから順列を生成して出力するプログラムを書いております。
ただし出力に際して順番が決まっています。
例えば、
4 7 9 1 3 と入力(最初の数字は個数を表す)すると、
7, 9, 1, 3
7, 9, 3, 1
7, 1, 3, 9
7, 1, 9, 3
7, 3, 9, 1
7, 3, 1, 9
9, 1, 3, 7
9, 1, 7, 3
9, 3, 7, 1
9, 3, 1, 7
9, 7, 1, 3
9, 7, 3, 1
1, 3, 7, 9
1, 3, 9, 7
1, 7, 9, 3
1, 7, 3, 9
1, 9, 3, 7
1, 9, 7, 3
3, 7, 9, 1
3, 7, 1, 9
3, 9, 1, 7
3, 9, 7, 1
3, 1, 7, 9
3, 1, 9, 7
この順番で出力されなくてはなりません。
しかし、今書いているプログラムだと、
7, 9, 1, 3
9, 7, 1, 3
7, 1, 9, 3
1, 7, 9, 3
1, 9, 7, 3
9, 1, 7, 3
7, 9, 3, 1
9, 7, 3, 1
7, 3, 9, 1
3, 7, 9, 1
3, 9, 7, 1
9, 3, 7, 1
7, 3, 1, 9
3, 7, 1, 9
7, 1, 3, 9
1, 7, 3, 9
1, 3, 7, 9
3, 1, 7, 9
3, 9, 1, 7
9, 3, 1, 7
3, 1, 9, 7
1, 3, 9, 7
1, 9, 3, 7
9, 1, 3, 7
このように出力されてしまいます。どのように変更すればよいでしょうか。
そのプログラムは以下の通りです。
[hidden][code]
#include <stdio.h>
int perm[10];
void swap(int *a,int *b)
{
int tmp;
tmp=*a;
*a=*b;
*b=tmp;
}
void printp(int n)
{
int i;
for(i=0; i<n; i++)
{
printf("%d",perm[i]);
if(i!=n-1)
{
printf(", ");
}
}
printf("\n");
}
void per(int m,int n)
{
int i;
if(m==0)
{
printp(n);
}
else
{
per(m-1,n);
for(i=m-1; i>=0; i--)
{
swap(&perm[m],&perm[i]);
per(m-1,n);
swap(&perm[m],&perm[i]);
}
}
}
int main(void)
{
int i,n;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&perm[i]);
}
per(n-1,n);
return 0 ;
}
[/code][/hidden]