0 / 0 / 0
Регистрация: 18.04.2017
Сообщений: 11
1

Заполнить квадратную матрицу по спирали

15.10.2017, 13:54. Показов 1981. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Cоставить программу, которая заполняет квадратную матрицу порядка n нaтуральными числами 1,2,3,...n,записывая их в нее "по спирали"
например, для n=5 получаем матрицу:

Код
 1  2  3  4  5 
16 17 18 19  6
15 24 25 20  7
14 23 22 21  8
13 12 11 10  9
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.10.2017, 13:54
Ответы с готовыми решениями:

Построить квадратную матрицу порядка 2n (emu8086)
Построить квадратную матрицу порядка 2n. Необходимо компилировать на emu8086. спасибо за ранее

Сформировать квадратную матрицу по заданному образцу
Сформировать квадратную матрицу порядка n по заданному образцу. Необходимо компилировать на emu8086

Сформировать квадратную матрицу по заданному образцу
Сформировать квадратную матрицу порядка n по заданному образцу: 0 0 0 ... 0 0 1 0 0 0 ... 0...

Сформировать квадратную матрицу по заданному образцу
задача на массивы(матрица),никак не могу решить Сформировать квадратную матрицу порядка n по...

1
Модератор
Эксперт по электронике
8490 / 4347 / 1644
Регистрация: 01.02.2015
Сообщений: 13,496
Записей в блоге: 8
15.10.2017, 19:38 2
Заполнить матрицу по свертывающейся спирали

Добавлено через 6 минут
Есть несколько способов решения.
1. Рекурсивный
Сортировка массива по часовой стрелке (без использования циклов)
2. За несколько вложенных циклов
https://www.cyberforum.ru/visu... d3621.html
3. За один цикл, но со сложным условием
Взято отсюда Заполнение матрицы по спирали
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
            const int n = 6;
            const int m = 8;
            int[,] matrix = new int[n, m];
 
            int row = 0;
            int col = 0;
            int dx = 1;
            int dy = 0;
            int dirChanges = 0;
            int visits = m;
 
            for (int i = 0; i < matrix.Length; i++) {
                matrix[row, col] = i + 1;
              if (--visits == 0) {
                visits = m * (dirChanges %2) + n * ((dirChanges + 1) %2) - (dirChanges/2 - 1) - 2;
                int temp = dx;
                dx = -dy;
                dy = temp;
                dirChanges++;
              }
 
              col += dx;
              row += dy;
            }
Добавлено через 3 часа 35 минут
Не понимая смысла алгоритма №3 просто перевожу его на ассемблер

Тут плохо в реализации то, что с десяток переменных процедуры заполнения матрицы нужно располагать на стеке, как локальные переменные. Да и параметры передавать через стек. Но тут я не уверен в возможностях компилятора emu8086 на автоматическую обработку символьных переменных, а ручками не хочется набирать [bp-8].
Также, при вычислении нового значения _visits можно упростить вычисления на битовые операции, там ведь смысл примерно такой
Код
  if dirChange это чётное число
    visits=n
  else
    visits=m
  visits+=(- (dirChanges/2 - 1) - 2)
Assembler
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
@stack  segment para stack
        db      1024 dup(?)
@stack  ends
 
@data   segment
        Nmax    equ     10
        N       dw      8
        Matrix  dw      (Nmax*Nmax) dup(?)
 
        CrLf    db      0Dh, 0Ah, '$'
 
        ;переменные для алгоритма заполнения матрицы по спирали
        _N              dw      ?
        _M              dw      ?
        _Row            dw      ?
        _Col            dw      ?
        _dx             dw      ?
        _dy             dw      ?
        _dirChanges     dw      ?
        _visits         dw      ?
        _MLength        dw      ?
 
 
@data   ends
 
@code   segment
        assume  cs:@code, ds:@data, ss:@stack
main    proc
        ;инициализация сегментного регистра данных
        mov     ax,     @data
        mov     ds,     ax
        mov     es,     ax
 
        ;инициализация матрицы
        lea     di,     [Matrix]
        mov     ax,     0
        mov     cx,     (Nmax*Nmax)
        rep     stosw
        ;заполнение матрицы по спирали
        lea     dx,     [Matrix]
        mov     cx,     [N]
        call    FillHelix
        ;вывод матрицы
        lea     dx,     [Matrix]
        mov     bx,     [N]
        mov     cx,     [N]
        call    ShowMatrix
 
        ;завершение программы
        mov     ax,     4C00h
        int 21h
main    endp
 
;Заполнение матрицы по спирали
;на входе:
;  ds:dx - адрес матрицы
;  cx    - размер квадратной матрицы
;на выходе:
;  заполненная по спирали матрица
FillHelix       proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    si
        push    di
 
        or      cx,     cx
        jnz     @@fhStart
        jmp     @@fhExit
@@fhStart:
        mov     bx,     dx      ;bx - адрес начала матрицы
 
        mov     ax,     cx
        mov     [_N],   ax
        mul     ax
        mov     [_MLength],     ax
 
        mov     ax,     0
        mov     [_row], ax      ;    int row = 0;
        mov     [_col], ax      ;    int col = 0;
        mov     ax,     1
        mov     [_dx],  ax      ;    int dx = 1;
        mov     ax,     0
        mov     [_dy],  ax      ;    int dy = 0;
        mov     [_dirChanges],ax;    int dirChanges = 0;
        mov     ax,     cx
        mov     [_M],   ax
        mov     [_visits],ax    ;    int visits = m;
 
        mov     cx,     0       ;    for (int i = 0; i < matrix.Length; i++) {
@@fhFor:
        inc     cx
        mov     ax,     [_row]  ;        matrix[row, col] = i + 1;
        mul     [_M]
        shl     ax,     1
        mov     si,     [_col]
        shl     si,     1
        add     si,     ax
        mov     [bx+si],cx
 
        dec     [_visits]       ;      if (--visits == 0) {
        jnz     @@fhEnd_if
                                ;        visits = m * (dirChanges %2)
        mov     ax,     [_dirChanges]
        and     ax,     1
        mul     [_M]
        mov     si,     ax
                                ;               + n * ((dirChanges + 1) %2)
        mov     ax,     [_dirChanges]
        inc     ax
        and     ax,     1
        mul     [_N]
        add     si,     ax
                                ;               - (dirChanges/2 - 1) - 2;
        mov     ax,     [_dirChanges]
        shr     ax,     1
        dec     ax
        sub     si,     ax
        sub     si,     2
        mov     [_visits],si
 
        mov     si,     [_dx]   ;        int temp = dx;
        mov     ax,     [_dy]   ;        dx = -dy;
        neg     ax
        mov     [_dx],  ax
        mov     [_dy],  si      ;        dy = temp;
        inc     [_dirChanges]   ;        dirChanges++;
                                ;      }
@@fhEnd_if:
        mov     ax,     [_dx]   ;      col += dx;
        add     [_col], ax
        mov     ax,     [_dy]   ;      row += dy;
        add     [_row], ax
 
        cmp     cx,     [_MLength]
        jb      @@fhFor         ;    }
 
 
@@fhExit:
        pop     di
        pop     si
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
FillHelix       endp
 
;Вывод на экран матрицы слов
;на входе:
;  ds:dx - адрес матрицы
;  bx    - количество столбцов в матрице
;  cx    - количество строк в мматрице
;на входе:
;  -
ShowMatrix      proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    si
        push    di
        pushf
 
        jcxz    @@smExit
        or      bx,     bx
        jz      @@smExit
 
        cld
        mov     cx,     cx
        mov     si,     dx
        @@smForI:
                push    cx
                push    bx
                mov     cx,     bx
                @@smForJ:
                        lodsw
                        call    Show_AX
                loop    @@smForJ
                mov     ah,     09h
                lea     dx,     [CrLf]
                int     21h
                pop     bx
                pop     cx
        loop    @@smForI
 
@@smExit:
        popf
        pop     di
        pop     si
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
ShowMatrix      endp
 
; выводит знаковое 16-разрядное число из регистра AX на экран
; входные данные:
; ax - число для отображения
Show_AX proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    si
        push    di
 
        mov     cx,     10      ;основание системы счисления
        xor     di,     di      ; di - кол. цифр в числе
        xor     si,     si      ; si - признак отрицательного числа
        ; если число в ax отрицательное, то
        ;1) напечатать (запомнить в стеке) символ '-'
        ;2) сделать ax положительным
        or      ax,     ax
        jns     @@Conv
        mov     si,     1
 
        neg     ax
 
@@Conv:
        xor     dx,     dx
        div     cx              ; dl = num mod 10
        add     dl,     '0'     ; перевод в символьный формат
        inc     di
        push    dx              ; складываем в стек
        or      ax,     ax
        jnz     @@Conv
        ;если число отрицательное - помещаем символ "-" в строку
        or      si,     si
        jz      @@Positive
        mov     dx,     '-'
        push    dx
        inc     di
@@Positive:
        ; выводим из стека на экран
        ; - сначала пробелы для выравнивания по правому краю
        mov     cx,     8
        sub     cx,     di
        mov     ah,     02h
        mov     dl,     ' '
@@LeftPad:
        int     21h
        loop    @@LeftPad
        ;сохранённые символы цифр
@@Show:
        pop     dx              ; dl = очередной выводимый символ
        mov     ah,     2       ; ah - функция вывода символа на экран
        int     21h
        dec     di              ; повторяем пока di<>0
        jnz     @@Show
 
        pop     di
        pop     si
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
Show_AX endp
 
@code   ends
 
        end     main
0
15.10.2017, 19:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.10.2017, 19:38
Помогаю со студенческими работами здесь

Даны числа а1, а2,., . Получить квадратную матрицу порядка n:
1) Даны числа а1, а2,..., аn. Получить квадратную матрицу порядка n: что и как делать?

Сформировать квадратную матрицу порядка n по заданному образцу
Создайте квадратную матрицу порядка n на заданном образце: 1 1 1 ... 1 1 1 2 2 2 ... 2 2 0 3...

Сформировать квадратную матрицу порядка n по заданному образцу
Сформировать квадратную матрицу порядка n по заданному образцу. Использовать .model tiny

Записать массив спиралью в двухмерную квадратную матрицу
Следует ввести с клавиатуры массив, содержащий не менее 16 символов ASCII. Требуется записать ее...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru