遍历1-n的每一个元素,深搜的关键点在于选与不选,在选择的时候检查是否有限制里面的元素,该跳过跳过.
/** * struct Point { * int x; * int y; * Point(int xx, int yy) : x(xx), y(yy) {} * }; */ int ans = 0; bool vis[23]; class Solution { public: bool check(int n, int m, vector<Point>& limit) { for (int i=0;i<m;i++) { Point p = limit[i]; if (p.x==n) { if (vis[p.y]) return false; } if (p.y==n) { if (vis[p.x]) return false; } } return true; } void DFS(int n, int m, vector<Point>& limit) { if (n==0) { ans++; return ; } //不选 DFS(n-1, m, limit); //选 //验证是否可以选 if (check(n, m, limit)) { vis[n] = true; DFS(n-1, m, limit); vis[n] = false; } } /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param n int 集合大小 * @param m int 限制数量 * @param limit Pointvector 不能同时出现的(u,v)集合 * @return int */ //遍历1-n的每一个元素,深搜的关键点在于选与不选,在选择的时候检查是否有限制里面的元素,该跳过跳过 int solve(int n, int m, vector<Point>& limit) { // write code here DFS(n, m, limit); return ans; } };