problem oko zadatka

Ako je to za fakulter, onda znaci da je nivo srednje skole. Nego mislim da znam sta to znaci desnom spiralom. Znaci sortirati tako da
spiralno ide u krug redosled. Najprostije resenje je uzeti sve elemente u niz, sortirati pa spiralno popuniti, komplikacija je sto
se ne dozvoljava pomocni niz. E sad desna spirala bi trebalo da znaci sa leva na desno prolazak u krug
ili sa desna na levo? Po prirodi stvari posto nismo arapi mi citamo sa leva na desno ;)
 
Ako je to za fakulter, onda znaci da je nivo srednje skole. Nego mislim da znam sta to znaci desnom spiralom. Znaci sortirati tako da
spiralno ide u krug redosled. Najprostije resenje je uzeti sve elemente u niz, sortirati pa spiralno popuniti, komplikacija je sto
se ne dozvoljava pomocni niz. E sad desna spirala bi trebalo da znaci sa leva na desno prolazak u krug
ili sa desna na levo? Po prirodi stvari posto nismo arapi mi citamo sa leva na desno ;)
ako ti nije problem mozes mi napisati kod ako znas?
 
Inace evo ti sad resenje, tu su i debug printovi:
Kod:
#include <stdio.h>

void spiral_find_min(int matrix[100][100],int i, int j, int m, int n, int lm, int ln, int order){
    printf("%d %d %d %d\n",i,j,m,n);
    int mini = i, minj = j;
    int np=n/2+n%2;
    printf("np %d order %d\n",np,order);
    for (int k = 0;k<np;++k){
        switch(order) {
            case 1:
                {
    for (;j<m;++j){
        if (matrix[mini][minj] > matrix[i][j]){
            int tmp = matrix[mini][minj];
            matrix[mini][minj]=matrix[i][j];
            matrix[i][j]=tmp;
        }
        printf("1: %d %d\n",i,j);
    }
    ++i;--j;
                }
            case 2:{
    for (;i<n;++i){
        if (matrix[mini][minj] > matrix[i][j]){
            int tmp = matrix[mini][minj];
            matrix[mini][minj]=matrix[i][j];
            matrix[i][j]=tmp;
        }
        printf("2: %d %d\n",i,j);
    }
    --i;--j;
                   }
            case 3:{
    for (;j>=lm;--j){
        if (matrix[mini][minj] > matrix[i][j]){
            int tmp = matrix[mini][minj];
            matrix[mini][minj]=matrix[i][j];
            matrix[i][j]=tmp;
        }
        printf("3: %d %d\n",i,j);
    }
    --i;++j;
                   }
            case 4:
    for (;i>ln;--i){
        if (matrix[mini][minj] > matrix[i][j]){
            int tmp = matrix[mini][minj];
            matrix[mini][minj]=matrix[i][j];
            matrix[i][j]=tmp;
        }
        printf("4: %d %d\n",i,j);
    }
        }
    ++i;
    ++ln;++lm;--m;--n;
    order = 1;
    puts("-------");
    }
}

void spiral_sort(int matrix[100][100],int m,int n){
    int i=0,j=0;
    int lm = 0,ln = 0;
    int np = n/2+n%2;
    int mm=m,nn=n;
    for (int k = 0;k<np;++k){
    for (;j<m;++j){
        spiral_find_min(matrix,i,j,m,n,lm,ln,1);
    }
    for (++i,--j;i<n;++i){
        spiral_find_min(matrix,i,j,m,n,lm,ln,2);
    }
    for (--i,--j;j>=lm;--j){
        spiral_find_min(matrix,i,j,m,n,lm,ln,3);
    }
    for (--i,++j;i>ln;--i){
        spiral_find_min(matrix,i,j,m,n,lm,ln,4);
    }
    ++i;
    ++ln;++lm;--m;--n;
    }
}
void print_matrix(int matrix[100][100],int m,int n){
    for (int i=0; i<n; ++i){
        for (int j=0;j<m;++j){
            printf(" %d",matrix[i][j]);
        }
        puts("");
    }
}
int main(void){
    int matrix[100][100] = { {1,2,3}, {4,5,6}, {7,8,9}, {10,11,12}};
    spiral_sort(matrix,3,4);
    print_matrix(matrix,3,4);
    return 0;
}

edit:
sad videh, obrnuo sam mozda m i n, meni je m broj kolona, a n broj redova ;)
 
Poslednja izmena:
Inace evo ti sad resenje, tu su i debug printovi:
Kod:
#include <stdio.h>

void spiral_find_min(int matrix[100][100],int i, int j, int m, int n, int lm, int ln, int order){
    printf("%d %d %d %d\n",i,j,m,n);
    int mini = i, minj = j;
    int np=n/2+n%2;
    printf("np %d order %d\n",np,order);
    for (int k = 0;k<np;++k){
        switch(order) {
            case 1:
                {
    for (;j<m;++j){
        if (matrix[mini][minj] > matrix[i][j]){
            int tmp = matrix[mini][minj];
            matrix[mini][minj]=matrix[i][j];
            matrix[i][j]=tmp;
        }
        printf("1: %d %d\n",i,j);
    }
    ++i;--j;
                }
            case 2:{
    for (;i<n;++i){
        if (matrix[mini][minj] > matrix[i][j]){
            int tmp = matrix[mini][minj];
            matrix[mini][minj]=matrix[i][j];
            matrix[i][j]=tmp;
        }
        printf("2: %d %d\n",i,j);
    }
    --i;--j;
                   }
            case 3:{
    for (;j>=lm;--j){
        if (matrix[mini][minj] > matrix[i][j]){
            int tmp = matrix[mini][minj];
            matrix[mini][minj]=matrix[i][j];
            matrix[i][j]=tmp;
        }
        printf("3: %d %d\n",i,j);
    }
    --i;++j;
                   }
            case 4:
    for (;i>ln;--i){
        if (matrix[mini][minj] > matrix[i][j]){
            int tmp = matrix[mini][minj];
            matrix[mini][minj]=matrix[i][j];
            matrix[i][j]=tmp;
        }
        printf("4: %d %d\n",i,j);
    }
        }
    ++i;
    ++ln;++lm;--m;--n;
    order = 1;
    puts("-------");
    }
}

void spiral_sort(int matrix[100][100],int m,int n){
    int i=0,j=0;
    int lm = 0,ln = 0;
    int np = n/2+n%2;
    int mm=m,nn=n;
    for (int k = 0;k<np;++k){
    for (;j<m;++j){
        spiral_find_min(matrix,i,j,m,n,lm,ln,1);
    }
    for (++i,--j;i<n;++i){
        spiral_find_min(matrix,i,j,m,n,lm,ln,2);
    }
    for (--i,--j;j>=lm;--j){
        spiral_find_min(matrix,i,j,m,n,lm,ln,3);
    }
    for (--i,++j;i>ln;--i){
        spiral_find_min(matrix,i,j,m,n,lm,ln,4);
    }
    ++i;
    ++ln;++lm;--m;--n;
    }
}
void print_matrix(int matrix[100][100],int m,int n){
    for (int i=0; i<n; ++i){
        for (int j=0;j<m;++j){
            printf(" %d",matrix[i][j]);
        }
        puts("");
    }
}
int main(void){
    int matrix[100][100] = { {1,2,3}, {4,5,6}, {7,8,9}, {10,11,12}};
    spiral_sort(matrix,3,4);
    print_matrix(matrix,3,4);
    return 0;
}

edit:
sad videh, obrnuo sam mozda m i n, meni je m broj kolona, a n broj redova ;)
nema veze, hvala puno :D
 

Back
Top