Главная  Полное построение алгоритма 

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92] [93] [94] [95] [ 96 ] [97] [98] [99] [100] [101] [102] [103] [104] [105] [106] [107] [108] [109] [110] [111] [112] [113] [114] [115] [116] [117]

в отражение этого квадрата относительно центра. Если очередной квадрат содержит пометку, поместим число -К в этот квадрат,

а число К в его отражение. Продолжим эту процедуру вплоть до заполнения всего массива. На рис. 6.1.3, в показан пример заполнения квадрата после 14 шагов; на рис. 6.1.3, г приведен полностью заполненный магический квадрат.

Algorithm DEMS (дважды четный магический квадрат) для построения магического квадрата NxN, где N=4m для некоторого положительного целвго т. Элементы магического квадрата запоминаются в линейном массиве MATRIX из элементов.

Шаг 0. [Инициализация] Set HALFN ч- N/2; MAR К 1; MIDDLE ч-N/2; UPPER iV+l; and HALF N/2.

Шаг 1. [Внешний цикл пометок] For К-\ io HALFN do through шаг 4 od. (Этот и следующий циклы задают первоначальную расстановку пометок первой половины массива.) Шаг 2. [Внутренний цикл пометок] Рог У -t- I to HALFN do шаг 3 od.

Шаг 3. [Расстановка пометок]

Set MATRIX (MIDDLE - /+1) ч- MARK; MATRIX (MIDDLE4-/) MARK; and MARK -MARK. Шаг 4. [Переход к следующей строке] Set MIDDLE -<-MIDDLE+iV; and MARK -MARK. Шаг 5. [Цикл расстановки чисел] For / 1 to HALF do mar 6 od; and STOP.

Шаг 6. [Запись чисел] Set L ч- /; if MATRIX (/)<0 then set L -<r- UPPER-/ fi (L - это будущая координата числа /); set MATRIX (L) /; and MATRIX (UPPER-L) UPPER-/. (B массиве размещаются / и его отражение.)

Алгоритм DEMS использует шахматный порядок расстановки пометок в левом верхнем квадранте и число MIDDLE для попадания в середину каждой строки. Пометки ставятся одновременно в обоих верхних квадрантах. Очевидно, что сложность имеет порядок O(N).

Чтобы убедиться в правильности этого алгоритма, снова воспользуемся частями (X, Y), введенными выше. Рассмотрим любые две строки, равноудаленные от центра, например, строки i-1 и N-i. Эти две строки показаны на рис. 6.1.4. Все квадраты пронумерованы последовательно, начиная с левого верхнего угла, слева направо и сверху вниз. Иначе говоря, все квадраты пронумерованы так, как будто никаких пометок не существует. Заметим, что каждое число представлено в виде k=X+Y.

Все элементы, первоначально находившиеся в этих двух строках, остаются в них после всех перестановок, вызванных отмеченными квадратами в алгоритме. В (t-1)-й строке 2т частей X со значением Х= = (/-\)N обмениваются местами с 2т частями X со значением Х=



== (Л-i)N из строки -i. По симметрии каждая перестановка в паре с другой затрагивают 4 числа. Алгоритм переставляет части Y этих четырех чисел таким образом, что в каждой строке имеется полный набор частей У - от F==l до Y=N - после того, как произведены

• • •

(i-1)N + 1

(i-1)n + 2

• • •

(m)n+n

(n-i)n+1

(n-;)n + 2

• о V

(n-On + n

• • •

Рис. 6.1.4. Размещение чисел в двух строках, расположенных эквидистантно относительно центра, при использовании алгоритма DEMS.

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

ROWSUM = 1-f 2-f 3-Ь ...-Ь yv Ч-[(t - 1)/V Ч-(Af - О Л] 4-=

N(N + l) N(N-N) ~ 2 2

N(N• + 1)

Это как раз та сумма, которая должна быть у магического квадрата (см. упр. 6.1.3).

Аналогичные рассуждения можно провести, чтобы показать, что в момент окончания работы алгоритма суммы по столбцам и главным диагоналям равны также [N(N+l)]/2.

Игра «нимбы»

«Нимбы» - это игра двух лиц, в которой существует изумительно простая стратегия выигрыша для одного из игроков.

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



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

ХОД 5

ход 3

ХОД 1 {.АУ

Рис. 6.1.5. Пример игры в «нимбь».

лую строку. Второй игрок занимает клетки в столбцах аналогичным образом. Игра заканчивается, когда одному из игроков не останется клетки для очередного хода, что означает проигрыш. Полный пример игры приведен на рис. 6.1.5. Эта игра относится к классу игр с полной информацией. Это означает, что каждый игрок полностью знает прошлые ходы и возможности своего противника.

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

На всех квадратных полях ЛХЛ побеждает второй игрок В. У игрока А первоначально есть возможных ходов. Каждый ход занимает прямоугольную область (часть строки). Если игрок В никогда не делит поле надвое ни на одном из ходов, то В не вмешивается в монотонное убывание числа возможных ходов игрока А. Так как А ходил первым, он делает последний ход и проигрывает, т. е. после (N-1)-го хода игрока В игрок А должен исчерпать поле. Если поле не квадратной формы, то игрок, движущийся параллельно короткой стороне, выиграет, пользуясь стратегией игрока В.

Теперь вернемся к «нимбам», игре, в которой первый из игроков, не имеющий хода, проигрывает. Все области будут помечены по четности их измерений, причем первым будет измерение, обращенное к А. Так, на рис. 6.1.5 область, остающаяся после первого хода игрока Л, является четно-нечетной. Будет показано, что для А можно гарантировать выигрыш на четно-четном, нечетно-нечетном и нечетно-четном полях; для В можно гарантировать выигрыш на четно-нечетном поле. Таким образом, игрок В, движущийся параллельно четному измере-



[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92] [93] [94] [95] [ 96 ] [97] [98] [99] [100] [101] [102] [103] [104] [105] [106] [107] [108] [109] [110] [111] [112] [113] [114] [115] [116] [117]

0.001