# GÓC SÁNG TẠO > Khu vực lập trình > Pascal/Delphi/Kylix >  mảng 2 chiều nè

## vlzmaytinh

1.Nhập từ bàn phím 1 ma trận A kick thước m*n. Sau đó xếp a thành 1 ma trận xoáy ốc tăng dần thuận chiều kim đồng hồ .
VD 
[a]1 2 3 4 
12 13 14 5
11 16 15 6
10 9 8 7.[a/]​2.Ma trận KIM TỰ THÁP như sau ( với n cấp lẻ ) 
VD n=3
3 3 3 3 3
3 2 2 2 3
3 2 1 2 3
3 2 2 2 3
3 3 3 3 3.
3.Ma phương là 1 bảng sô vuông có số dòng , số cột lẻ và tổng các giá trị của các dòng , các cột , đường chéo chính , đường chéo phụ bằng nhau . Hãy nhập n lẻ và hiện ra MA PHƯỜNG cấp n .
VD n=3
8 1 6
3 5 7
4 9 2 -> các tổng đều bằng 15.

Trên đây là mấy bài làm bằng mảng 2 chiều ai giúp em với ạ ! Em xin cám ơn ạ !

----------


## phukatana

Bài 1 thì có topic mình viết code rồi, mọi người cũng nói rồi. Bạn chịu khó tìm nhe.
Bài 2 thì yêu cầu là gi?
Bài 3 thì vét cạn hay sao ý.

----------


## doken

> 1.Nhập từ bàn phím 1 ma trận A kick thước m*n. Sau đó xếp a thành 1 ma trận xoáy ốc tăng dần thuận chiều kim đồng hồ .
> VD 
> [a]1 2 3 4 
> 12 13 14 5
> 11 16 15 6
> 10 9 8 7.[a/]​2.Ma trận KIM TỰ THÁP như sau ( với n cấp lẻ ) 
> VD n=3
> 3 3 3 3 3
> 3 2 2 2 3
> ...


 Nếu theo yêu cầu thì bài 3 không cần phải quay lui, chạy rất chậm, chỉ dùng 2 biến i,j với một dòng for từ 1 đến n^2. Đây là một trong những bài toán học theo kiểu sodoku, có quy luật điền.

----------


## truong coi

bải 3 thì bạn mình làm 2-3 dòng for chứ đâu phải 1 đâu nhỉ :-?
nếu 1 dòng for thì bạn có thể cho mình xin đoạn code đó được không !?

----------


## fpicseo

> Nếu theo yêu cầu thì bài 3 không cần phải quay lui, chạy rất chậm, chỉ dùng 2 biến i,j với một dòng for từ 1 đến n^2. Đây là một trong những bài toán học theo kiểu sodoku, có quy luật điền.


 Quy luật điền như nào thế? Không hiểu điền như nào. Mình chơi sudoku còn thỉnh thoảng tịt phải ngồi vét cạn. [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG] Chơi gà mừ

----------


## kulu193

Các bạn có biết bài test IQ theo chuẩn của VN không? Có cả phần này đấy, quy luật luôn điền số ((n^2)/2) + 1 ở giữa ma trận, rồi phát triển theo chiều chéo, nếu ra khỏi ma trận ta coi như có ô đó, ghép số đó vào ô tương xứng, rồi bắt đầu tiếp từ ô tương xứng, để mình xem lại rồi post lên hé.

----------


## seolalen154643

> Các bạn có biết bài test IQ theo chuẩn của VN không? Có cả phần này đấy, quy luật luôn điền số ((n^2)/2) + 1 ở giữa ma trận, rồi phát triển theo chiều chéo, nếu ra khỏi ma trận ta coi như có ô đó, ghép số đó vào ô tương xứng, rồi bắt đầu tiếp từ ô tương xứng, để mình xem lại rồi post lên hé.


 Đây, bài giải dựa theo quy luật điền đó đây, điền theo thứ tự, nhưng mình quên mất là cuối cùng khi in ra thì vẫn phải 2 dòng for => O(n^2) (chán nhỉ!):


```
uses crt;
var a:array[1..99,1..99] of integer;n,i,j,gt:integer;
begin
        write('Nhap cap ma phuong(le):');
        readln(n);
        if (n mod 2 <>1) or (n<0) then write('Khong the co ma phuong')
            else
                 begin
                       j:=1;
                       i:=(n+1) div 2;
                       fillchar(a,sizeof(a),0);
                       for gt:=1 to n*n do
                           begin
                                 a[i,j]:=gt;
                                 if gt mod n = 0 then inc(j)
                                    else
                                         begin
                                                dec(j);
                                                inc(i);
                                                if j<1 then j:=n;
                                                if i>n then i:=1;
                                         end;
                           end;
                       for j:=1 to n do
                           begin
                                 for i:=1 to n do write(a[i,j],'  ');
                                 writeln;
                           end;
                 end;
        readln;
end.
```

----------


## htkkplus

Cuối cùng vẫn là O(n^2) ah`. Chán thế, có ai có cách khác <O(n^2) không?

----------


## recvietnam316

> Cuối cùng vẫn là O(n^2) ah`. Chán thế, có ai có cách khác <O(n^2) không?


 Không thể nào, vì cuối cùng luôn luôn phải dùng 2 dòng for để in ra mảng đó, dù bạn xử lý tốt cỡ nào.

----------


## canhohcm123

b3:
http://en.wikipedia.org/wiki/Magic_square

cách của Nguyên là tốt nhất r` . Các vị trí a[i,j] xđ k liên típ nên k thể in ra trong khi xử lí đc

b2 : 2 vòng for lồng trong 1 vòng repeat

b1 : 4 vòng for lồng trong 1 vòng repeat

nếu cần , mình sẽ gửi code wa tin nhắn cho bạn

----------


## dungthinh225

sm yêu cầu mình post code lun
b1 


```
const fi='matran.inp';
      fo='matran.out';

var   f:text;
      n,c1,c2,h1,h2:integer;
      a:array[1..100,1..100] of integer;

procedure inp;
begin
      assign(f,fi);
      reset(f);
      readln(f,n);
      close(f);
end;

procedure sol;
var   i,j,k:integer;
begin
      c1:=1; c2:=n;
      h1:=2; h2:=n;
      k:=1;
      repeat
            for j:=c1 to c2 do
            begin
                  a[h1-1,j]:=k;
                  inc(k);
            end;
            dec(c2);
            for i:=h1 to h2 do
            begin
                  a[i,c2+1]:=k;
                  inc(k);
            end;
            dec(h2);
            for j:=c2 downto c1 do
            begin
                  a[h2+1,j]:=k;
                  inc(k);
            end;
            inc(c1);
            for i:=h2 downto h1 do
            begin
                  a[i,c1-1]:=k;
                  inc(k);
            end;
            inc(h1);
      until k>=sqr(n);
end;

procedure pri;
var   i,j:integer;
begin
      assign(f,fo);
      rewrite(f);
      for i:=1 to n do
      begin
            for j:=1 to n do
                  write(f,a[i,j],' ');
            writeln(f);
      end;
      close(f);
end;

begin
      inp; sol; pri;
end.
```

b2 :


```
const fi='ktthap.inp';
      fo='ktthap.out';

var   f:text;
      a:array[1..100,1..100] of integer;
      m:integer;

procedure inp;
begin
      assign(f,fi);
      reset(f);
      readln(f,m);
      close(f);
      inc(m,2);
end;

procedure sol;
var   i,j,d,c,n:integer;
begin
      i:=1; j:=m; n:=m;
      repeat
            for c:=i to n do
            begin
                  a[i,c]:=n-2;
                  a[j,c]:=n-2;
            end;
            for d:=i to n do
            begin
                  a[d,i]:=n-2;
                  a[d,j]:=n-2;
            end;
            inc(i); dec(j); dec(n);
      until n=1;
end;

procedure pri;
var   i,j:integer;
begin
      assign(f,fo);
      rewrite(f);
      for i:=1 to m do
      begin
            for j:=1 to m do
                  write(f,a[i,j],' ');
            writeln(f);
      end;
      close(f);
end;

begin
      inp; sol; pri;
end.
```

---------------------------------Bài viết đã được trộn ---------------------------------
chỉ cần chú ý biến chạy , tăng và giảm nó hợp lí thôi

----------


## myphamchatluong

cám ơn chị nhưng mà chị dùng thuật toán với mấy hàm bọn em chưa học
em thử viết code cho 1 và 2 , mọi người cho ý kiến :


```
uses crt;
var A:array[1..100,1..100] of longint;
    i,j,n,k,b,cc,cd,dc,dd,m,o:longint;
begin
     clrscr;
     write('nhap m,n:');readln(m,n);
     dd:=1;dc:=m;cd:=1;cc:=n;k:=0;b:=1;
     o:=(trunc(n/2)+1);
     repeat
             for i:=cd to cc-1 do
             begin
                    A[dd,i]:=b;
                    inc(b);
             end;
             for i:=dd to dc-1 do
             begin
                    A[i,cc]:=b;
                    inc(b);
             end;
             for i:=cc downto cd+1 do
             begin
                    A[dc,i]:=b;
                    inc(b);
             end;
             for i:=dc downto dd+1 do
             begin
                    A[i,cd]:=b;
                    inc(b);
             end;
             inc(dd);
             inc(cd);
             dec(dc);
             dec(cc);
             inc(k);
             if dc<dd then
             begin
                    A[o,o]:=b;
                    break;
             end;
             until b> (m*n);
             for i:=1 to m do
             begin
                    for j:=1 to n do
                    write(A[i,j]:5);
                    writeln;writeln;
             end;
             readln;
end.
```



```
uses crt;
var A:array[1..100,1..100] of longint;
     i,j,n,k,b,cc,cd,dc,dd:longint;
begin
      clrscr;
      write('nhap n:');readln(n);
      b:=n*2-1;
      dd:=1;dc:=b;cd:=1;cc:=b;k:=0;
      repeat
              for i:=cd to cc-1 do
                  A[dd,i]:=n-k;
              for i:=dd to dc-1 do
                  A[i,cc]:=n-k;
              for i:=cc downto cd+1 do
                  A[dc,i]:=n-k;
              for i:=dc downto dd+1 do
                  A[i,cd]:=n-k;
              inc(dd);
              inc(cd);
              dec(dc);
              dec(cc);
              inc(k);
     until k=n;
     A[n,n]:=1;
     for i:=1 to b do
     begin
            for j:=1 to b do
                write(A[i,j]:3);
                writeln;writeln;
     end;
     readln;
end.
```

----------


## bedaukute22

hàm sqr hả bạn ?
sqr là hàm mũ 2 [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]

----------

