Вы действительно лучше с императивным или рекурсивным решением здесь.Я напишу рекурсивный:
def finder(arr: Array[Array[Int]], w: Int, i: Int = 0, j: Int = 0): Option[(Int,Int,Int)] = {
val ri = arr.length-i-1
if (i >= arr.length) None
else if (arr(ri)(j) > 0 && arr(ri)(j) < w) Some(ri,j,arr(ri)(j))
else if (j+1 < arr(i).length) finder(arr,w,i,j+1)
else finder(arr,w,i+1)
}
Тогда finder(M,W)
должен делать то, что вы хотите.Обратите внимание, что это также эффективно - без бокса, кроме возвращаемого значения.
Правка - если вы заботитесь о производительности, вот время выполнения существующих решений в массиве 100x100, который не имеет решенийили одно решение на 77% пути к концу (т. е. время выполнения должно быть около 1/4):
Original without answer: 65 μs / iteration
Original with answer at 1/4: 18 μs / iteration
Таблица результатов по сравнению с оригинальным методом, относительное время выполнения (чем ниже, тем быстрее, скомпилировано с -оптимизировать, но это вряд ли что-то меняет):
No Answer 1/4 Answer
Original 1.00 1.00
Rex 0.55 0.72
4e6 1.95 7.00
missingfaktor 2.41 1.91
Luigi 4.93 3.92
Таким образом, ваш оригинальный метод был на самом деле быстрее всех предложений, за исключением рекурсивного.