Queen's Attack II Discussions | Algorithms | HackerRank
  • + 1 comment

    C++ solution. Being n the size of the board and k the number of obstacles, the complexity is O(n+k):

    bool containObstacle (unordered_map<int, unordered_set<int>> &data, int row, int column){
        return data.find(row) != data.end() && data[row].find(column) != data[row].end();
    }
    
    int queensAttack(int n, int k, int r_q, int c_q, vector<vector<int>> obstacles) {
        // Insert obstacles
        unordered_map<int, unordered_set<int>> obstacle_positions;
        for (auto obstacle : obstacles) obstacle_positions[obstacle.front()].insert(obstacle.back());
        
        int attackable_positions {0};
        
        // Check left
        for (int i=c_q-1; i>0; i--) {
            if (!containObstacle(obstacle_positions, r_q, i)) attackable_positions++; 
            else break;
        }
        
        // Check right
        for (int i=c_q+1; i<=n; i++) {
            if (!containObstacle(obstacle_positions, r_q, i)) attackable_positions++; 
            else break;
        }
    
        // Check up
        for (int i=r_q-1; i>0; i--) {
            if (!containObstacle(obstacle_positions, i, c_q)) attackable_positions++; 
            else break;
        }
        
        // Check down
        for (int i=r_q+1; i<=n; i++) {
            if (!containObstacle(obstacle_positions, i, c_q)) attackable_positions++; 
            else break;
        }
        
        // Check up-left diagonal
        for (int i=r_q-1, j=c_q-1; i>0 && j>0; i--, j--) {
            if (!containObstacle(obstacle_positions, i, j)) attackable_positions++; 
            else break;
        }
        
        // Check up-right diagonal
        for (int i=r_q-1, j=c_q+1; i>0 && j<=n; i--, j++) {
            if (!containObstacle(obstacle_positions, i, j)) attackable_positions++; 
            else break;
        }
        
        // Check down-left diagonal
        for (int i=r_q+1, j=c_q-1; i<=n && j>0; i++, j--) {
            if (!containObstacle(obstacle_positions, i, j)) attackable_positions++; 
            else break;
        }
        
        // Check down-right diagonal
        for (int i=r_q+1, j=c_q+1; i<=n && j<=n; i++, j++) {
            if (!containObstacle(obstacle_positions, i, j)) attackable_positions++; 
            else break;
        }
        
        return attackable_positions;
    }