 個の要素を持つ文字形の配列a[]が与えられているとする。このとき、a[0]〜
a[N-1]の要素を並べ替えて得られる
個の要素を持つ文字形の配列a[]が与えられているとする。このとき、a[0]〜
a[N-1]の要素を並べ替えて得られる 個の順列を全て印刷するプログラムについ
て以下の問に答えなさい。
個の順列を全て印刷するプログラムについ
て以下の問に答えなさい。
なお、a[]〜a[N-1]に対する全ての順列を生成するという作業は、a[N-1] の要素をa[0]〜a[N-1]のいずれか一つの要素と交換したN通りの状況に対して、 それぞれ、a[0]〜a[N-2]の順序を全て生成することによりなされる点に注意す ること。
![\framebox[5mm][c]{\hspace{3mm}{{\footnotesize A}}\hspace{3mm}}](img3.png) 〜
〜
![\framebox[5mm][c]{\hspace{3mm}{{\footnotesize E}}\hspace{3mm}}](img4.png) を埋めなさい。
	      ただし、下記プログラムにおいてNの値は3である。
を埋めなさい。
	      ただし、下記プログラムにおいてNの値は3である。
  
#include <stdio.h>
#define N (3)
char a[N]={'a', 'b', 'c'};
main()
{
  perm(a, N);
}
perm(char a[], int n)
{
  int i;
  if(n <= 1)
    print_a(a, N);
  else
    for(i=0; i <n; i++){
      swap(a, i, n-1);
perm(a,![\framebox[5mm][c]{\hspace{3mm}{{\footnotesize A}}\hspace{3mm}}](img5.png)
n-1);
swap(a,![\framebox[5mm][c]{\hspace{3mm}{{\footnotesize B}}\hspace{3mm}}](img6.png)
,![\framebox[5mm][c]{\hspace{3mm}{{\footnotesize C}}\hspace{3mm}}](img7.png)
);
    }
}
swap(char a[], int i, int j)
{
  char c;
  c=a[i];
a[i]=![\framebox[5mm][c]{\hspace{3mm}{{\footnotesize D}}\hspace{3mm}}](img8.png)
;
a[j]=![\framebox[5mm][c]{\hspace{3mm}{{\footnotesize E}}\hspace{3mm}}](img9.png)
;
}
print_a(char a[], int n)
{
  int i;
  printf("%c", a[0]);
  for(i=1; i<n; i++)
    printf(" %c", a[i]);
  printf("\n");
}
ざっと、プログラムは、こんな感じである。以下に解答を示すので、よく理解せよ。
![\framebox[5mm][c]{\hspace{3mm}{{\footnotesize A}}\hspace{3mm}}](img10.png) n-1
 n-1 
![\framebox[5mm][c]{\hspace{3mm}{{\footnotesize B}}\hspace{3mm}}](img11.png) n-1
 n-1 
![\framebox[5mm][c]{\hspace{3mm}{{\footnotesize C}}\hspace{3mm}}](img12.png) i
 i 
![\framebox[5mm][c]{\hspace{3mm}{{\footnotesize D}}\hspace{3mm}}](img13.png) a[j]
 a[j] 
![\framebox[5mm][c]{\hspace{3mm}{{\footnotesize E}}\hspace{3mm}}](img14.png) c
 c
  
b c a c b a c a b a c b b a c a b c