[Algorithm][综合训练][kotori和气球][体操队形][二叉树中的最大路径和]详细讲解

时间:2025-04-24 12:26:17
#include <iostream> #include <vector> using namespace std; int n = 0, ret = 0; vector<int> nums; vector<bool> visit; void DFS(int pos) { if(pos == n + 1) { ret++; return; } // 对于该位置,依次枚举每个队员 for(int i = 1; i <= n; i++) { if(visit[i]) // 剪枝 -> i队员已经被放过 { continue; } if(visit[nums[i]]) // 剪枝 -> i队员的诉求已经无法完成 { return; } visit[i] = true; // 放上i号队员 DFS(pos + 1); visit[i] = false; // 回溯 } } int main() { cin >> n; nums.resize(n + 1, 0); visit.resize(n + 1, false); for(int i = 1; i <= n; i++) { cin >> nums[i]; } DFS(1); // 按进入位置划分 cout << ret << endl; return 0; }