Advertisement
Alex_tz307

USACO 2013 December Contest, Bronze Problem 3. Wormholes

Dec 1st, 2020
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.22 KB | None | 0 0
  1. // http://www.usaco.org/index.php?page=viewproblem2&cpid=360
  2. #include <bits/stdc++.h>
  3.  
  4. using namespace std;
  5.  
  6. ifstream fin("wormhole.in");
  7. ofstream fout("wormhole.out");
  8.  
  9. int N;
  10. vector <int> X(16), Y(16), partner(16), next_on_right(16);
  11.  
  12. bool is_cycle() {
  13.     for(int start = 1; start <= N; ++start) {
  14.         int pos = start;
  15.         for(int cnt = 0; cnt < N; ++cnt)
  16.             pos = next_on_right[partner[pos]];
  17.         if(pos != 0)
  18.             return true;
  19.     }
  20.     return false;
  21. }
  22.  
  23. int solve() {
  24.     int i;
  25.     for(i = 1; i <= N; ++i)
  26.         if(partner[i] == 0)
  27.             break;
  28.     if(i > N)
  29.         return is_cycle();
  30.     int sol = 0;
  31.     for(int j = i + 1; j <= N; ++j)
  32.         if(partner[j] == 0) {
  33.             partner[i] = j;
  34.             partner[j] = i;
  35.             sol += solve();
  36.             partner[i] = partner[j] = 0;
  37.         }
  38.     return sol;
  39. }
  40.  
  41. int main() {
  42.     fin >> N;
  43.     for(int i = 1; i <= N; ++i)
  44.         fin >> X[i] >> Y[i];
  45.     for(int i = 1; i <= N; ++i)
  46.         for(int j = 1; j <= N; ++j)
  47.             if(X[j] > X[i] && Y[i] == Y[j])
  48.                 if(next_on_right[i] == 0 || X[j] < X[next_on_right[i]])
  49.                     next_on_right[i] = j;
  50.     fout << solve();
  51. }
  52.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement