infoarena

infoarena - concursuri, probleme, evaluator, articole => Teme => Subiect creat de: Muresan Stefan din Iulie 10, 2015, 14:46:40



Titlul: Probleme UBB
Scris de: Muresan Stefan din Iulie 10, 2015, 14:46:40
Salut !
As avea nevoie de o solutie la aceasta problema daca se poate. Chiar nu-mi vine nimic in minte...

Se da o matrice cu n linii si n coloane si se cere sa se interschimbe elementele din triunghiul superior cu cele din triunghiul inferior iar cele din triunghiul din stanga cu cele din triunghiul din dreapta. Nu gasesc vreo legatura generala intre i si j pentru a le putea interschimba:-?

Multumesc anticipat !!


Titlul: Răspuns: Probleme UBB
Scris de: FMI Razvan Birisan din Iulie 31, 2015, 15:39:40
A[ i ][ j ] aparține matricei A, 0 <= i,j <= N-1.

Elementele diagonalei principale respectă relația i = j, altfel spus au forma A[ i ][ i ]. ( Cele colorate cu verde )
Elementele diagonalei secundare sunt de forma A[ i ][ N-i-1 ]. ( Cele colorate cu albastru )

(http://i1.someimage.com/C7JEYDZ.jpg)

INTERSCHIMBARE TRIUNGHI SUPERIOR/INFERIOR:
Cod:
    for( i = 0 ; i < N/2 ; ++i )
        for( j = i+1 ; j < N-i-1 ; ++j )
        {
            aux = Mat[i][j];
            Mat[i][j] = Mat[N-i-1][j];
            Mat[N-i-1][j] = aux;
        }

INTERSCHIMBARE TRIUNGHI STANGA/DREAPTA:
Cod:
    for( j = 0 ; j < N/2 ; ++j )
        for( i = j+1 ; i < N-j-1 ; ++i )
        {
            aux = Mat[i][j];
            Mat[i][j] = Mat[i][N-j-1];
            Mat[i][N-j-1] = aux;
        }

Sursă completă:
Cod:
# include <stdio.h>
# define InFile "input.txt"
# define OutFile "output.txt"
# define NMax 1000

int N,Mat[NMax][NMax];

void Citire()
{
    int i,j;
    scanf("%d",&N);
    for( i = 0 ; i < N ; ++i )
        for( j = 0 ; j < N ; ++j )
            scanf("%d",&Mat[i][j]);
}

void Rezolvare()
{
    int i,j,aux;

    // Triunghi superior - Triunghi inferior
    for( i = 0 ; i < N/2 ; ++i )
        for( j = i+1 ; j < N-i-1 ; ++j )
        {
            aux = Mat[i][j];
            Mat[i][j] = Mat[N-i-1][j];
            Mat[N-i-1][j] = aux;
        }

    // Triunghi stanga - Triunghi dreapta
    for( j = 0 ; j < N/2 ; ++j )
        for( i = j+1 ; i < N-j-1 ; ++i )
        {
            aux = Mat[i][j];
            Mat[i][j] = Mat[i][N-j-1];
            Mat[i][N-j-1] = aux;
        }

}

void Tipar()
{
    int i,j;

    for( i = 0 ; i < N ; ++i, putchar('\n') )
        for( j = 0 ; j < N ; ++j )
            printf("%d ",Mat[i][j]);
}

int main()
{
    freopen(InFile,"r",stdin);
    freopen(OutFile,"w",stdout);

    Citire();
    Rezolvare();
    Tipar();

    return 0;
}