Spiral matrix: Difference between revisions

Content added Content deleted
No edit summary
Line 186: Line 186:
13 22 21 20 7
13 22 21 20 7
12 11 10 9 8</pre>
12 11 10 9 8</pre>

=={{header|ABAP}}==

<lang ABAP>REPORT zspiral_matrix.

CLASS lcl_spiral_matrix DEFINITION FINAL.
PUBLIC SECTION.

TYPES:
BEGIN OF ty_coordinates,
dy TYPE i,
dx TYPE i,
value TYPE i,
END OF ty_coordinates,
ty_t_coordinates TYPE STANDARD TABLE OF ty_coordinates WITH EMPTY KEY.

DATA mv_dimention TYPE i.
DATA mv_initial_value TYPE i.

METHODS:
constructor IMPORTING iv_dimention TYPE i
iv_initial_value TYPE i,

get_table RETURNING VALUE(rv_result) TYPE ty_t_coordinates,

print.

PRIVATE SECTION.
DATA lt_coordinates TYPE ty_t_coordinates.

METHODS create RETURNING VALUE(ro_result) TYPE REF TO lcl_spiral_matrix.

ENDCLASS.

CLASS lcl_spiral_matrix IMPLEMENTATION.
METHOD constructor.

mv_dimention = iv_dimention.
mv_initial_value = iv_initial_value.

create( ).

ENDMETHOD.

METHOD create.

DATA dy TYPE i.
DATA dx TYPE i.
DATA value TYPE i.
DATA seq_number TYPE i.
DATA seq_dimention TYPE i.
DATA sign_coef TYPE i VALUE -1.

value = mv_initial_value.

" Fill in the first row (index 0)
DO mv_dimention TIMES.
APPEND VALUE #( dy = dy dx = dx value = value ) TO lt_coordinates.
value = value + 1.
dx = dx + 1.
ENDDO.

seq_dimention = mv_dimention.

" Find the row and column numbers and set the values.
DO ( 2 * mv_dimention - 2 ) / 2 TIMES.
sign_coef = - sign_coef.
seq_dimention = seq_dimention - 1.

DO 2 TIMES.
seq_number = seq_number + 1.

DO seq_dimention TIMES.

IF seq_number MOD 2 <> 0.
dy = dy + 1 * sign_coef.
ELSE.
dx = dx - 1 * sign_coef.
ENDIF.

APPEND VALUE #( dy = dy dx = dx value = value ) TO lt_coordinates.
value = value + 1.
ENDDO.

ENDDO.

ENDDO.

ro_result = me.

ENDMETHOD.

METHOD get_table.
rv_result = lt_coordinates.
ENDMETHOD.

METHOD print.

DATA cnt TYPE i.
DATA line TYPE string.

SORT lt_coordinates BY dy dx ASCENDING.

LOOP AT lt_coordinates ASSIGNING FIELD-SYMBOL(<ls_coordinates>).

cnt = cnt + 1.
line = |{ line } { <ls_coordinates>-value }|.

IF cnt MOD mv_dimention = 0.
WRITE / line.
CLEAR line.
ENDIF.

ENDLOOP.

ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.

DATA(go_spiral_matrix) = NEW lcl_spiral_matrix( iv_dimention = 5
iv_initial_value = 0 ).
go_spiral_matrix->print( ).</lang>

{{out}}
<pre>
0 1 2 3 4
15 16 17 18 5
14 23 24 19 6
13 22 21 20 7
12 11 10 9 8
</pre>


=={{header|Action!}}==
=={{header|Action!}}==