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