[关闭]
@LinKArftc 2015-07-14T09:38:11.000000Z 字数 1147 阅读 1197

Wormhole

USACO


标程 solve() 函数递归写的太溜,代码风格和调试过程很值得参考

  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4. #define MAX_N 12
  5. int N, X[MAX_N+1], Y[MAX_N+1];
  6. int partner[MAX_N+1];
  7. int next_on_right[MAX_N+1];
  8. bool cycle_exists(void)
  9. {
  10. for (int start=1; start<=N; start++) {
  11. // does there exist a cylce starting from start
  12. int pos = start;
  13. for (int count=0; count<N; count++)
  14. pos = next_on_right[partner[pos]];
  15. if (pos != 0) return true;
  16. }
  17. return false;
  18. }
  19. // count all solutions
  20. int solve(void)
  21. {
  22. // find first unpaired wormhole
  23. int i, total=0;
  24. for (i=1; i<=N; i++)
  25. if (partner[i] == 0) break;
  26. // everyone paired?
  27. if (i > N) {
  28. if (cycle_exists()) return 1;
  29. else return 0;
  30. }
  31. // try pairing i with all possible other wormholes j
  32. for (int j=i+1; j<=N; j++)
  33. if (partner[j] == 0) {
  34. // try pairing i & j, let recursion continue to
  35. // generate the rest of the solution
  36. partner[i] = j;
  37. partner[j] = i;
  38. total += solve();
  39. partner[i] = partner[j] = 0;
  40. }
  41. return total;
  42. }
  43. int main(void)
  44. {
  45. ifstream fin("wormhole.in");
  46. fin >> N;
  47. for (int i=1; i<=N; i++) fin >> X[i] >> Y[i];
  48. fin.close();
  49. for (int i=1; i<=N; i++) // set next_on_right[i]...
  50. for (int j=1; j<=N; j++)
  51. if (X[j] > X[i] && Y[i] == Y[j]) // j right of i...
  52. if (next_on_right[i] == 0 ||
  53. X[j]-X[i] < X[next_on_right[i]]-X[i])
  54. next_on_right[i] = j;
  55. ofstream fout("wormhole.out");
  56. fout << solve() << "\n";
  57. fout.close();
  58. return 0;
  59. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注