Queen's Attack II Discussions | Algorithms | HackerRank
  • + 0 comments
    /*
     * Complete the 'queensAttack' function below.
     *
     * The function is expected to return an INTEGER.
     * The function accepts following parameters:
     *  1. INTEGER n
     *  2. INTEGER k
     *  3. INTEGER r_q
     *  4. INTEGER c_q
     *  5. 2D_INTEGER_ARRAY obstacles
     */
    
    void _info(int n, int k, int r_q, int c_q, vector<vector<int>> obstacles) {
        cout << "n: " << n << endl;
        cout << "q: " << r_q << "," << c_q << endl;
        for (auto ob: obstacles) {
            auto r = ob[0];
            auto c = ob[1];
            cout << "o: " << r << ',' << c << endl;
        }    
    }
    
    int _north(int n, int r_q, int c_q, const vector<vector<int>>& obstacles) {
        vector<int> z = { r_q };
        for (auto ob: obstacles) {
            if (ob[1] == c_q) {
                auto dr = r_q - ob[0];
                if (dr > 0) { z.push_back(dr); }
            }
        }
        auto d = *min_element(z.begin(), z.end());
        return d - 1;
    }
    
    int _east(int n, int r_q, int c_q, const vector<vector<int>>& obstacles) {
        vector<int> z = { n + 1 - c_q };
        for (auto ob: obstacles) {
            if (ob[0] == r_q) {
                auto dc = ob[1] - c_q;
                if (dc > 0) { z.push_back(dc); }
            }
        }
        auto d = *min_element(z.begin(), z.end());
        return d - 1;
    }
    
    int _south(int n, int r_q, int c_q, const vector<vector<int>>& obstacles) {
        vector<int> z = { n + 1 - r_q };
        for (auto ob: obstacles) {
            if (ob[1] == c_q) {
                auto dr = ob[0] - r_q;
                if (dr > 0) { z.push_back(dr); }
            }
        }
        auto d = *min_element(z.begin(), z.end());
        return d - 1;
    }
    
    int _west(int n, int r_q, int c_q, const vector<vector<int>>& obstacles) {
        vector<int> z = { c_q };
        for (auto ob: obstacles) {
            if (ob[0] == r_q) {
                auto dc = c_q - ob[1];
                if (dc > 0) { z.push_back(dc); }
            }
        }
        auto d = *min_element(z.begin(), z.end());
        return d - 1;
    }
    
    int _ne(int n, int r_q, int c_q, const vector<vector<int>>& obstacles) {
        int k = min(r_q, n + 1 - c_q);
        vector<int> z = {k};
        for (auto ob: obstacles) {
            auto dr = r_q - ob[0];
            auto dc = ob[1] - c_q;
            if ((dr > 0) && (dr == dc)) { z.push_back(dr); }
        }
        auto d = *min_element(z.begin(), z.end());
        return d - 1;
    }
    
    int _se(int n, int r_q, int c_q, const vector<vector<int>>& obstacles) {
        int k = min(n + 1 - r_q, n + 1 - c_q);
        vector<int> z = {k};
        for (auto ob: obstacles) {
            auto dr = ob[0] - r_q;
            auto dc = ob[1] - c_q;
            if ((dr > 0) && (dr == dc)) { z.push_back(dr); }
        }
        auto d = *min_element(z.begin(), z.end());
        return d - 1;
    }
    
    int _sw(int n, int r_q, int c_q, const vector<vector<int>>& obstacles) {
        int k = min(n + 1 - r_q, c_q);
        vector<int> z = {k};
        for (auto ob: obstacles) {
            auto dr = ob[0] - r_q;
            auto dc = c_q - ob[1];
            if ((dr > 0) && (dr == dc)) { z.push_back(dr); }
        }
        auto d = *min_element(z.begin(), z.end());
        return d - 1;
    }
    
    int _nw(int n, int r_q, int c_q, const vector<vector<int>>& obstacles) {
        int k = min(r_q, c_q);
        vector<int> z = {k};
        for (auto ob: obstacles) {
            auto dr = r_q - ob[0];
            auto dc = c_q - ob[1];
            if ((dr > 0) && (dr == dc)) { z.push_back(dr); }
        }
        auto d = *min_element(z.begin(), z.end());
        return d - 1;
    }
    
    int queensAttack(int n, int k, int r_q, int c_q, vector<vector<int>> obstacles) {
        
        // _info(n, k, r_q, c_q, obstacles);
        
        int cnt = 0;
        cnt += _north(n, r_q, c_q, obstacles);
        cnt += _east(n, r_q, c_q, obstacles);
        cnt += _south(n, r_q, c_q, obstacles);
        cnt += _west(n, r_q, c_q, obstacles);
        cnt += _ne(n, r_q, c_q, obstacles);
        cnt += _se(n, r_q, c_q, obstacles);
        cnt += _sw(n, r_q, c_q, obstacles);
        cnt += _nw(n, r_q, c_q, obstacles);
        
        // cout << cnt << endl;
        return cnt;
    }