>>194
遅くなっちゃったなあ.解析解がありそうな気がするけど,まあバックトラック.

#include <stdio.h>
#define N 5
int count;
void solve(int work[], int used[], int size, int pos) {
  int i;
  if (pos >= size) {
    for (i = 0; i < size; ++i) 
      printf("%c%d", (i == 0 ? '(' : ','), work[i]);
    printf(")\n");
    ++count;
  }
  for (i = 0; i < size; ++i)
    if (!used[i] && pos != i) 
      work[pos] = i, used[i] = 1, solve(work, used, size, pos+1), used[i] = 0;
}
main() {
  int work[N], used[N], i;
  for (i = 0; i < N; ++i) used[i] = 0;
  solve(work, used, N, 0);
  printf("number of dearangement for %d = %d\n", N, count);
}