문제

링크

풀이

#include <stdio.h>
#include <math.h>
 
typedef struct Coord {
  double x;
  double y;
} Coord;
 
int ccw(Coord p1, Coord p2, Coord p3) {
  double d = (p2.y-p3.y)*p1.x+(p1.y-p2.y)*p3.x+(p3.y-p1.y)*p2.x;
  if (d < 0) return -1;
  else if (d > 0) return 1;
  else return 0;
}
 
int check(int a[]) {
  Coord p[8];
 
  for (int i=0; i<8; i++) {
    p[i].x = sin((double)i*45*M_PI/180)*a[i];
    p[i].y = cos((double)i*45*M_PI/180)*a[i];
  }
 
  for (int i=0; i<6; i++) {
    if (ccw(p[i], p[i+1], p[i+2]) != -1) return 0;
  }
  if (ccw(p[6], p[7], p[0]) != -1) return 0;
  if (ccw(p[7], p[0], p[1]) != -1) return 0;
  return 1;
}
 
int permutation(int arr[], int brr[], int index, int size) {
  if (index == size) {
    if (check(brr)) return 1;
    else return 0;
  }
 
  int count = 0;
  for (int i=0; i<size; i++) {
    if (brr[i] == -1) {
      brr[i] = arr[index];
      count += permutation(arr, brr, index+1, size);
      brr[i] = -1;
    }
  }
  return count;
}
 
int main(void) {
  int arr[8], brr[8];
 
  for (int i=0; i<8; i++) {
    scanf("%d", &arr[i]);
    brr[i] = -1;
  }
 
  printf("%d", permutation(arr, brr, 0, 8));
  return 0;
}