Представьте себе создание лабиринта из двухмерного массива случайных значений. Массив будет 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
}
}
Для начала, как я могу реализовать ограничение, чтобы разрешить только соседям, которые не смежны с предыдущим изображением последовательности или последней позицией его пути?