Diễn đàn tin học Văn Lang - Vạn Ninh
Chào mừng bạn đến với Diễn đàn Tin học Văn Lang - Vạn Ninh của chúng tôi !
Hãy đăng nhập hoặc đăng kí tài khoản để trải nghiệm nhiều điều thú vị tại đây !
Thân ái !

Diễn đàn tin học Văn Lang - Vạn Ninh

Nơi trao đổi thông tin, tăng cường hợp tác, giải đáp những vướng mắc khi học lập trình Pascal
 
Trang ChínhCalendarTrợ giúpTìm kiếmThành viênNhómĐăng kýĐăng Nhập

Share | 
 

 Giải các bài toán đặc biệt về mảng hai chiều

Go down 
Tác giảThông điệp
Admin
Admin
avatar

Posts : 118
Danh tiếng : 5
Join date : 10/11/2014
Age : 17

Bài gửiTiêu đề: Giải các bài toán đặc biệt về mảng hai chiều   13/11/2014, 18:31

Bài 1: Phần tử aij của ma trận nguyên dương A cấp mxn được gọi là H2-chính phương nếu nó là số chính phương, đồng thời là phần tử lớn nhất của hàng i, cột j. Hãy tìm các số H2-chính phương của một ma trận nguyên dương A cấp mxn cho trước.
Bài giải:
uses crt;
type matran=array[1..100,1..100] of integer;
var i,n,j,h,max,m:integer;
   a:matran;
{-------------}
procedure nhap(var a:matran;n,m:integer);
var i,j:integer;
begin
    for i:=1 to n do
        for j:=1 to m do
            begin
                 write('Nhap a[',i,',',j,']:');
                 readln(a[i,j]);
            end;
end;
procedure xuat(var a:matran;n,m:integer);
var i,j:integer;
begin
    for i:=1 to n do
        begin
             for j:=1 to m do write(a[i,j]:5);
             writeln;
             writeln;
        end;
end;
{-----------------}
function hang(i,m:integer):integer;
var h:integer;
begin
    h:=a[i,1];
    for j:=2 to m do
    if h<a[i,j] then h:=a[i,j];
    hang:=h;
end;
{-----------------}
function cot(h,j,n:integer):boolean;
var i:integer;
begin
    cot:=false;
    for i:=1 to n do
    if h<a[i,j] then exit;
    cot:=true;
end;
{-----------------}
begin
    clrscr;
    write('Nhap so dong:');readln(n);
    write('Nhap so cot:');readln(m);
    nhap(a,n,m);
    writeln('Ma tran:');
    xuat(a,n,m);
    writeln('Cac so H2-chinh phuong :');
    for i:=1 to n do
    begin
         h:=hang(i,m);
         for j:=1 to m do
         if (a[i,j]=h) and (cot(h,j,n)) and (round(sqrt(a[i,j]))=sqrt(a[i,j])) then
         writeln(a[i,j] ,' o hang ',i,' cot ',j);
    end;
readln;
end.

Bài 2: Nhập ma trạn vuông cấp n. In ra ma trận B là hiệu của ma trận A và ma trận chuyển vị của nó.
Bài giải:
uses crt;
type matran=array[1..100,1..100] of integer;
var i,n,j:integer;
   a,b:matran;
{-------------}
procedure nhap(var a:matran;n:integer);
var i,j:integer;
begin
    for i:=1 to n do
        for j:=1 to n do
            begin
                 write('Nhap a[',i,',',j,']:');
                 readln(a[i,j]);
            end;
end;
procedure xuat(var a:matran;n:integer);
var i,j:integer;
begin
    for i:=1 to n do
        begin
             for j:=1 to n do write(a[i,j]:5);
             writeln;
             writeln;
        end;
end;
{-----------------}
begin
    clrscr;
    write('Ma tran A co cap do:');readln(n);
    nhap(a,n);
    writeln('Ma tran A:');
    xuat(a,n);
    for i:=1 to n do
        for j:=1 to n do
            b[i,j]:=a[i,j]-a[j,i];
    writeln('Ma tran la hieu cua ma tran A va chuyen vi cua ma tran A:');
    xuat(b,n);
    readln;
end.

Bài 3: Một phần tử được coi là điểm yên ngựa của ma trận, nếu nó là phần tử bé nhất của hàng chứa nó, đồng thời là phần tử lớn nhất của cột chứa nó. Nhập ma trận vuông A và tìm các diểm yên ngựa của ma trận.
Bài giải:
uses crt;
type matran=array[1..100,1..100] of integer;
var a,b:matran;
   i,j,n,vt,h,dem:integer;
(*****)
procedure nhap(var a:matran;n:integer);
var i,j:integer;
begin
    for i:=1 to n do
    for j:=1 to n do
    begin
         write('Nhap a[',i,',',j,']:');
         readln(a[i,j]);
    end;
end;
(*****)
procedure xuatmatran(var a:matran;n:integer);
var i,j:integer;
begin
    for i:=1 to n do
    begin
         for j:=1 to n do write(a[i,j]:5);
         writeln;
         writeln;
    end;
end;
(*****)
function hang(i:integer):integer;
var j:integer;
   h:integer;
begin
    h:=a[i,1];
    for j:=2 to n do
    if h>a[i,j] then h:=a[i,j];
    hang:=h;
end;
(*****)
function cot(h:integer;j:integer):boolean;
var i:integer;
begin
    cot:=false;
    for i:=1 to n do
    if h<a[i,j] then exit;
    cot:=true;
end;
(*****)
begin
clrscr;
      write('Nhap cap do ma tran:');readln(n);
      nhap(a,n);
      writeln('Ma tran ban dau:');
      xuatmatran(a,n);
      for i:=1 to n do
      begin
           h:=hang(i);
           for j:=1 to n do
           if (a[i,j]=h) and cot(h,j) then
           writeln('Diem yen ngua la :',a[i,j],'.Hang ',i,' ','cot',' ',j)
      end;
readln;
end.

Bài 4: Ma trận vuông A cấp n gọi là ma trận La tinh nếu mỗi hàng, mỗi cột đều là hoán vị của các số trong khoản [1..n]. Nhập vào một ma trận kiểm tra tính chất trên.
Bài giải:
uses crt;
type matran=array[1..100,1..100] of integer;
type mang=array[1..100] of integer;
var i,n,j,dem,k,l:integer;
   a:matran;
   b,x,y:mang;
{-------------}
procedure nhap(var a:matran;n:integer);
var i,j:integer;
begin
    for i:=1 to n do
        for j:=1 to n do
            begin
                 write('Nhap a[',i,',',j,']:');
                 readln(a[i,j]);
            end;
end;
procedure xuat(var a:matran;n:integer);
var i,j:integer;
begin
    for i:=1 to n do
        begin
             for j:=1 to n do write(a[i,j]:5);
             writeln;
             writeln;
        end;
end;
{-----------------}
begin
    clrscr;
    write('Ma tran co cap do:');readln(n);
    nhap(a,n);
    writeln('Ma tran:');
    xuat(a,n);
    dem:=0;
    for i:=1 to n do
        begin
             x[i]:=0;y[i]:=0;b[i]:=i;
        end;
    for i:=1 to n do
        begin
             for j:=1 to n do
                 for k:=1 to n do
                     begin
                          if (x[k]=0) and (b[k]=a[i,j]) then
                             begin
                                  inc(dem);
                                  x[k]:=1;
                             end;
                          if (y[k]=0) and (b[k]=a[j,i]) then
                             begin
                                  inc(dem);
                                  y[k]:=1;
                             end;
                     end;
             for l:=1 to n do
                 begin
                      x[l]:=0;y[l]:=0;
                 end;
        end;
    if dem=n*n+n*n then writeln('Ma tran nay la ma tran La tinh')
       else writeln('Ma tran nay khong phai la ma tran La tinh');
    readln;
end.

Bài 5: Ma trận được gọi là ma phương nếu tổng mỗi hàng, tổng mỗi cột, tổng mỗi đường chéo bằng nhau. Nhập ma trận vuông A cấp n, kiểm tra tính ma phương.
Bài giải:
uses crt;
type matran=array[1..100,1..100] of integer;
var i,n,j,sh,sc,sdcc,sdcp,dem,s:integer;
   a:matran;
{-------------}
procedure nhap(var a:matran;n:integer);
var i,j:integer;
begin
    for i:=1 to n do
        for j:=1 to n do
            begin
                 write('Nhap a[',i,',',j,']:');
                 readln(a[i,j]);
            end;
end;
procedure xuat(var a:matran;n:integer);
var i,j:integer;
begin
    for i:=1 to n do
        begin
             for j:=1 to n do write(a[i,j]:5);
             writeln;
             writeln;
        end;
end;
{-----------------}
begin
    clrscr;
    write('Ma tran co cap do:');readln(n);
    nhap(a,n);
    writeln('Ma tran:');
    xuat(a,n);
    s:=0;dem:=0;
    sdcc:=0;sdcp:=0;
    for i:=1 to n do s:=s+a[1,i];
    for i:=1 to n do
        begin
             sh:=0;sc:=0;
             for j:=1 to n do
                 begin
                      sh:=sh+a[i,j];
                      sc:=sc+a[j,i];
                 end;
             sdcc:=sdcc+a[i,i];
             sdcp:=sdcp+a[i,n-i+1];
             if sh=s then inc(dem);
             if sc=s then inc(dem);
        end;
    if sdcc=s then inc(dem);
    if sdcp=s then inc(dem);
    if dem=2*n+2 then writeln('Ma tran tren la ma phuong')
       else writeln('Ma tran tren khong phai la ma phuong');
    readln;
end.

Bài 6: Viết chương trình tạo 2 ma trận vuông A và B cùng cấp n, với n là số tự nhiên nhập tự bàn phím (n<20), các phần tử của mảng là các số tự nhiên được sinh ngẫu nhiên có giá trị từ 0 đến 99. Hãy thực hiện các yêu cầu sau:
a) Tìm ma trận C là ma trận có các phần tử là tổng các phần tử tương ứng của 2 ma trận A và B.
b) Sắp xếp ma trận C tăng dần theo hình xoắn ốc cùng chiều kim đồng hồ.
Bài giải:
uses crt;
type matran=array[1..100,1..100] of integer;
var d:array[1..100] of integer;
   i,n,j,k,m,t:integer;
   a,b,c:matran;
{------------------}
procedure sx(var a,b:integer);
var tam:integer;
begin
    tam:=a;
    a:=b;
    b:=tam;
end;
procedure xuat(var a:matran;n:integer);
var i,j:integer;
begin
    for i:=1 to n do
        begin
             for j:=1 to n do write(a[i,j]:5);
             writeln;
             writeln;
        end;
end;
procedure mttong(var a,b,c:matran;n:integer);
begin
    for i:=1 to n do
        for j:=1 to n do c[i,j]:=a[i,j]+b[i,j];
end;
{------------------}
begin
    clrscr;
    write('Hai ma tran co cap:');readln(n);
    randomize;
    for i:=1 to n do
        for j:=1 to n do
begin
a[i,j]:=random(99);
end;
    for i:=1 to n do
        for j:=1 to n do
begin
b[i,j]:=random(98)+1;
end;
    writeln('Ma tran A:');xuat(a,n);
    writeln('Ma tran B:');xuat(b,n);
    mttong(a,b,c,n);
    writeln('Ma tran C co cac phan tu la tong ma tran A va B:');
    xuat(c,n);
    k:=0;
    for i:=1 to n do
        for j:=1 to n do
            begin
                 inc(k);
                 d[k]:=c[i,j];
            end;
    for i:=1 to k-1 do
        for j:=i+1 to k do
            if d[i]>d[j] then sx(d[i],d[j]);
    t:=0;m:=0;i:=0;j:=0;
    repeat
          inc(i);
          inc(j);
          while (j<=(n-m)) and (t<k) do
                begin
                     inc(t);
                     c[i,j]:=d[t];
                     inc(j);
                end;
          dec(j);
          inc(i);
          while (i<=(n-m)) and (t<k) do
                begin
                     inc(t);
                     c[i,j]:=d[t];
                     inc(i);
                end;
          dec(i);
          dec(j);
          while (j>=(m+1)) and (t<k) do
                begin
                     inc(t);
                     c[i,j]:=d[t];
                     dec(j);
                end;
          inc(j);
          dec(i);
          while (i>=(m+2)) and (t<k) do
                begin
                     inc(t);
                     c[i,j]:=d[t];
                     dec(i);
                end;
          inc(m);
    until t=k;
    writeln('Ma tran C theo hinh xoan oc tang dan cung chieu kim dong ho:');
    xuat(c,n);
    readln;
end.
Về Đầu Trang Go down
Xem lý lịch thành viên http://forumpascalvanlang.forumvi.com
 
Giải các bài toán đặc biệt về mảng hai chiều
Về Đầu Trang 
Trang 1 trong tổng số 1 trang

Permissions in this forum:Bạn không có quyền trả lời bài viết
Diễn đàn tin học Văn Lang - Vạn Ninh :: Bài tập :: Mảng :: Mảng hai chiều-
Chuyển đến