Можно ли сканировать весь двумерный массив на предмет максимально длинных полос одинаково оцененных блоков? - PullRequest
0 голосов
/ 05 апреля 2019

Представьте себе создание лабиринта из двухмерного массива случайных значений. Массив будет 160x160, в общей сложности 25 600 значений. Каждое поле имеет значение от 0 до 10. На данный момент единственными допустимыми значениями, которые позволяют вам перемещаться по лабиринту, являются 9 и 10. Любое значение меньше 9 является барьером и не может быть подсчитано на пути. Вы можете начать в любой точке лабиринта со значения 9 или 10 и двигаться в любом направлении через сетку, то есть вверх, вниз, влево, вправо и по диагонали, к другому значению 9 или 10. Однако ВЫ НЕ МОЖЕТЕ ДВИГАТЬСЯ В ПЛОЩАДЬ, КОТОРЫЕ СОСЕДИ КОРОБКИ НЕМЕДЛЕННО ПРЕВЫШАЮТ ВАШУ ПОЗИЦИЮ. Другими словами, каждая другая коробка на вашем пути НЕ может касаться. Если ни одно из 8 возможных соседних значений не равно 9 или 10, путь отбрасывается. Цель этого алгоритма - записать максимально длинный путь, сохранить и удалить эти значения из массива и перейти к поиску следующего наиболее длинного пути и т. Д.

В настоящее время я могу сортировать массив только по порядку от наибольшего значения до минимального значения полного массива. Пожалуйста, дайте мне знать ваши мысли о том, как это достижимо. Я готов нанять помощь по этому вопросу, если кто-то думает, что может справиться с этим.

if (densityArray.count > 1) {

    //            let checker: String = "\(intensityValues[imgToDraw]!)"
    //            if (checker == "7.3"){
    //                imgToDraw = densityArray[0]
    //            }

    //Remove 'imgToDraw' from 'densityArray'

    densityArray = densityArray.filter { $0 != imgToDraw }

    //If 'imgToDraw' is a all-white image, find the darkest neighbour of 'imgToDraw' from 'densityArray'

    let checker: String = "\(intensityValues[imgToDraw]!)"

    if (checker == "1.1"){
        imgToDraw = nearestNeighbour()
    }

    //Calculate position of 'imgToDraw', according to its origional position on unfiltered image

    let x = imgToDraw%1000
    let y = (imgToDraw-x)/1000

    testingImageView.frame = CGRect(x: CGFloat(x) * width, y: CGFloat(y) * height, width: width, height: height)

    testingImageView.image = self.imageArray[y][x]
    self.sketchView.addSubview(testingImageView)

    //Find all neighbouring images of current image('imgToDraw')

// Здесь мы хотели бы найти только соседей, которые не ограничивают положение предыдущего изображения. Другими словами, нам нужно запомнить положение самого последнего изображения на нашем пути, и любые потенциальные соседи, которые находятся рядом с этим предыдущим изображением, исключаются из выбора. Иными словами, каждое другое изображение на своем пути не может касаться.

    var nebs = findNeighbours(i: y, j: x)

    //Finding darkest images from neighbours

    var heighest = CGFloat()
    var heighestIndex = 0
    var neighboursLeft = false

    for i in 0...(nebs.count-1){

        if((heighest < self.intensityValues[nebs[i]]!)&&(densityArray.contains(nebs[i]))){
            heighest = self.intensityValues[nebs[i]]!
            heighestIndex = nebs[i]
            neighboursLeft = true
        }else {
        }
    }

    //If all images haven't been printed and our  current image does not have any immediate neighbour

    if ((neighboursLeft == false)&&(densityArray.count > 1)){
        //  imgToDraw = densityArray[0]

        imgToDraw = nearestNeighbour()

    } else {
        imgToDraw = heighestIndex
    }
}

Для начала, как я могу реализовать ограничение, чтобы разрешить только соседям, которые не смежны с предыдущим изображением последовательности или последней позицией его пути?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...