private int calculateCombinationsForNumber(int numberIndex) {
        Point numberPos = numbers.get(numberIndex);
        int numberOfCombinations = 0;
        List<Point> neighbors = new LinkedList<>();
        int missingBombs;
        
        missingBombs = findNeighborsAndMissingBombs(numberPos, neighbors);
        if( missingBombs<0 )
            return 0;
        
        for( Point neighbor : neighbors )
            if( ocurrencesOfMines[neighbor.x][neighbor.y] == -1 )
                ocurrencesOfMines[neighbor.x][neighbor.y] = 0;
        
        if( missingBombs==0 ){
            int increment = calculateCombinationsForNextNeighbor(numberIndex, neighbors);
            numberOfCombinations += increment;
        }else{
            if( neighbors.isEmpty() )
                return 0;
            for( Point neighbor : neighbors ){
                probabilities[neighbor.x][neighbor.y] = 1;
                int increment;
                
                if( missingBombs > 1 )
                    increment = calculateCombinationsForNumber(numberIndex);
                else 
                    increment = calculateCombinationsForNextNeighbor(numberIndex, neighbors);
                numberOfCombinations += increment;
                ocurrencesOfMines[neighbor.x][neighbor.y] += increment;
                probabilities[neighbor.x][neighbor.y] = 0;
            }
        }
        for( Point neigh : neighbors )
            probabilities[neigh.x][neigh.y] = -1;
        
        return numberOfCombinations;
    }