解析代码const int N = 1e6; vector<pair<int, int>>p; int n, Q; bool b[N]; int brr[N]; int arr[N]; int comt = 0; vector<int>a; int agg[N]; bool check(int a, int b) { for (int i = 0; i < p.size(); i++) { if (a == p[i].first && b == p[i].second) { return false; } } return true; } void dfs(int x){ if (x == n){ for (auto t : a)cout << t << " "; cout << "\n"; return; } for (int i = n; i >= 1; i--){ if (b[i] != true && check(x + 1, i)){ a.push_back(i); b[i] = true; dfs(x + 1); a.pop_back(); b[i] = false; } } return; } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> Q; for (int i = 1; i <= Q; i++) { int x, y; cin >> x >> y; p.push_back({ x,y }); agg[y] = x; } dfs(0); return 0; }
时间: 2023-06-18 14:05:39 浏览: 129
深入const int *p与int * const p的区别详解(常量指针与指向常量的指针)
5星 · 资源好评率100%
这段代码实现了一个排列组合的算法,通过dfs枚举所有可能的排列组合。
首先,定义了常量N为1000000、一个保存二元组的vector p、整数n和Q、一个bool数组b[N]、一个整型数组brr[N]、一个整型数组arr[N]、整数comt、一个保存整数的vector a、一个整型数组agg[N]。
然后,定义了一个check函数,用来检查是否可以填入一个数,如果填入的数已经在p中出现过,则返回false,否则返回true。
接着,定义了一个dfs函数,用来枚举所有的排列组合。如果当前枚举到n个数,则输出排列组合,并返回。
如果当前枚举的数可以填入,则将其添加到vector a中,将b[i]设为true,递归调用dfs函数,然后将vector a中的最后一个数弹出,将b[i]设为false。
最后,读取输入,将已经出现的二元组存入vector p和agg数组中,调用dfs函数,输出所有的排列组合。
需要注意的是,由于n的范围比较大,因此需要使用vector来保存排列组合。同时,由于需要判断一个数是否出现过,因此使用bool数组b[N]来保存。
阅读全文