fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int main()
  5. {
  6. int t, n, x, y;
  7. pair<int, int> pt[17];
  8. int mask;
  9. int mat[17][17];
  10. int mn[1<<16];
  11. set<int> used;
  12.  
  13. cin >> t;
  14. for(int k=1; k<=t; k++){
  15. cin >> n;
  16. for(int i=1; i<=n; i++){
  17. cin >> x >> y;
  18. pt[i] = make_pair(x, y);
  19. }
  20. for(int i=1; i<=n; i++){
  21. for(int j=i+1; j<=n; j++){
  22. mask = 0;
  23. for(int m=1; m<=n; m++){
  24. int t1 = (pt[j].first-pt[i].first)*(pt[m].second-pt[i].second);
  25. int t2 = (pt[j].second-pt[i].second)*(pt[m].first-pt[i].first);
  26. if(t1 == t2) mask |= (1<<(m-1));
  27. }
  28. mat[i][j] = mask;
  29. }
  30. }
  31. int target = (1<<n)-1;
  32. mn[0] = 0;
  33. for(int i=1; i<=target; i++)
  34. mn[i] = 16*16+500;
  35. used.clear();
  36. for(int i=1; i<=n; i++){
  37. for(int j=i+1; j<=n; j++){
  38. mask = mat[i][j];
  39. if(used.find(mask) != used.end()) continue;
  40. used.insert(mask);
  41. for(int u=target-1; u>=0; u--){
  42. mn[u|mask] = min(mn[u|mask], mn[u]+1);
  43. }
  44. }
  45. }
  46. if(n == 1) mn[target] = 1;
  47. printf("Case %d: %d\n", k, mn[target]);
  48. }
  49.  
  50. return 0;
  51. }
  52.  
Success #stdin #stdout 0s 3608KB
stdin
2

2
-10 20
20 10

16
-10 20
10 10
111 232
48 83
-34 20
12 22
33 33
13 -12
100 100
32 123
543 345
999 999
-999 -999
1000 1000
1000 0
0 1000
stdout
Case 1: 1
Case 2: 6