Мне дали серию неотрицательных целых чисел.

43 18 5 67 1 72 16 17 15 93 38 6 83 10 49 98 7 47 61 52 71 79 82 52 8

Мне нужно сохранить его в массиве m * n из Outside-In . Следующее:

m = 5
n = 5

outside-in

Затем мне нужно вычислить сумму определенной части 2D-массива. (Я уже выполнил эту часть) .

Мой идеальный подход к хранению чисел:

 1. Initialize starti,startj = 0.
 2. Initialize endi = m , endj = n.
 3. Store the remaining numbers in array[starti][j], where j starts from startj and ends at endj.
 4. Store the remaining numbers in array[i][endj], where i starts from starti and ends at endi.
 5. Store the remaining numbers in array[endi][j], where j starts from endj and ends at startj.
 6. Store the remaining numbers in array[i][endj], where i starts from endi and ends at starti.
 7. Decrement endi and endj by 1. 
 8. Increment starti and start j by 1.
 9. Repeat the steps 3 - 8 until the last number is stored.

Вопрос: Есть ли лучший способ решить эту проблему?

Дополнительно: я пытался придумать (но безуспешно) с formula to find where the last element is stored before doing all these operation.

3
Thanakron Tandavas 15 Мар 2013 в 12:27
Вы реализовали свой метод? Это дает правильный результат, но вы ищете лучший метод? Или это не дает правильного вывода?
 – 
taskinoor
15 Мар 2013 в 12:33
Я еще не реализовал эти методы, но считаю, что это даст правильный результат.
 – 
Thanakron Tandavas
15 Мар 2013 в 12:35
1
Вы должны реализовать поискового робота вместо формулы, чтобы узнать, где должно идти число #N в массиве размеров W * H.
 – 
Vesper
15 Мар 2013 в 12:36

1 ответ

Лучший ответ

Вот один способ.

Сначала вы можете начать думать рекурсивно

Имейте метод с подписью наподобие `fill (m, n, start_position, direction)

Рекурсивная версия будет выглядеть примерно так

fill(m,n, starting_position, direction) {

// If m=0 or n=0 you have a base case.
// Start at starting position, and fill in the direction.
// Decrement m or n, depending on the direction
// Compute new starting position and direction
// Recursively call fill with the updated m,n, starting_pos, direction
}

Теперь обратите внимание, что этот метод хвостовой рекурсии, и поэтому вы можете избавиться от рекурсии и заменить его циклом while с условием цикла while, полученным из базового случая.

0
Knoothe 15 Мар 2013 в 14:12
Это была не моя домашняя работа. Это практическая проблема для местной практики ACM-ICPC в моей стране.
 – 
Thanakron Tandavas
23 Мар 2013 в 22:21