遍历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;
}
};

京公网安备 11010502036488号