题目

原题链接
image.png

思路

  • 整体思路:暴力搜索 + 哈希表优化
  • 暴力遍历,遇到已经访问过的位置就提前剪枝,提高速度。
  • 哈希表使用技巧vis[a << 20 | b << 10 | c]可以将三元组和访问状态进行一一映射。避免了使用更繁琐的数据结构。
  • 树如下图所示

image.png
注意访问次序

代码

  1. #include <iostream>
  2. #include <unordered_map>
  3. using namespace std;
  4. void dfs(int a, int b, int c, int n, unordered_map<int, int>& vis, int& ans) {
  5. if (a > n || b > n || c > n) {
  6. return;
  7. }
  8. if (vis[a << 20| b << 10| c] == 1) {
  9. return;
  10. }
  11. if (!(1 <= a && a <= b && b <= c && c <= n)){
  12. return;
  13. }
  14. vis[a << 20| b << 10| c] = 1;
  15. if (((a ^ b ^ c) == 0) && (a + b > c)) {
  16. ans += 1;
  17. }
  18. dfs(a + 1, b, c, n, vis, ans);
  19. dfs(a, b + 1, c, n ,vis, ans);
  20. dfs(a, b, c + 1, n, vis, ans);
  21. }
  22. int main() {
  23. int n = 0;
  24. scanf("%d", &n);
  25. unordered_map<int, int> vis;
  26. int ans = 0;
  27. dfs(1, 1, 1, n, vis, ans);
  28. printf("%d", ans);
  29. return 0;
  30. }