Home > database >  Concentric square matrix
Concentric square matrix

Time:01-22

I have coding problem to write concentric square matrix (biggest number is in the middle) For example user needs to write an matrix For example:

                 5 5 5 5 5 
                 5 6 6 6 5
                 5 6 7 6 5     
                 5 6 6 6 5 
                 5 5 5 5 5

My program has to output "Yes" because this is, by my program's rules, a concentric square matrix.

                 5 5 5 5 5 
                 5 6 6 6 5
                 5 6 7 8 5     
                 5 6 6 6 5 
                 5 5 5 5 5

This is not a concentric square matrix because 8 is in 4th column and 3rd row.

This is my code:

#include <stdio.h>

int main() {
    
    int mat[100][100];
    int i,j;
    int n;
    scanf("%d",&n);
    printf("Unesite matricu; ");
    for(i=0;i<n;i  )
    {
        for(j=0;j<n;j  )
        {
            scanf("%d",&mat[i][j]);
        }
    }    
}

I don't know how to do the rest of it so if someone can help me, I would be happy :))

Comment::

I forgot to say that only odd numbers can be the dimension of the matrix (1,3,11,27). The only final output of the program has to be "YES (if the matrix is a concentric square matrix) or "NO" (if it's not). I know how to make a concentric square matrix when the user inputs a number (for example, 4) and the matrix has 2*n-1 dimensions. And through the loops, the program automatically makes the matrix (if you know what I mean). But for my matrix, the user has to input all the elements of the matrix and the program has to check if the matrix is concentric or not.

CodePudding user response:

Would you please try the following:

#include <stdio.h>

int main() {

    int mat[100][100];
    int ii[] = {0, 1, 0, -1};           // incremental numbers of i
    int jj[] = {1, 0, -1, 0};           // incremental numbers of j

    int i, j;
    int n;
    int u, v, w;                        // variables to walk on edges
    int val;                            // value of the element
    int prev = -1;                      // previous value in one outer edge (assuming the matrix values are positive)
    int length;                         // length of the side of the edge

    // read matrix size and values
    printf("Enter the number:\n");
    scanf("%d", &n);

    printf("Enter the matrix:\n");
    for (i = 0; i < n; i  ) {
        for (j = 0; j < n; j  ) {
            scanf("%d", &mat[i][j]);
        }
    }

    // loop on the edges
    for (u = 0; u < n / 2; u  ) {       // from the outmost edge to inner
        i = u; j = u;                   // index of the north west corner
        val = mat[u][u];                // initial value to compare
        for (v = 0; v < 4; v  ) {       // four sides
            length = n - u * 2 - 1;     // length of the side of the edge
            for (w = 0; w < length; w  ) {
                i  = ii[v];             // one step ahead on the edge
                j  = jj[v];             // same as above
                if (mat[i][j] != val || mat[i][j] <= prev) {
                    printf("No at [%d][%d] (val=%d)\n", i, j, mat[i][j]);
                    return 1;
                }
            }
        }
        prev = mat[i][j];
    }

    // finally examine the center value
    if (mat[u][u] <= prev) {
        printf("No at [%d][%d] (val=%d)\n", u, u, mat[u][u]);
        return 1;
    }

    printf("Yes\n");
    return 0;
}

The basic concept is to generate a series of indexes of the edge such as:

[0, 1], [0, 2], [0, 3], [0, 4],
[1, 4], [2, 4], [3, 4], [4, 4],
[4, 3], [4, 2], [4, 1], [4, 0],
[3, 0], [2, 0], [1, 0], [0, 0]

by using the variables i, j and the arrays ii[], jj[].
The example above is the indexes for the outermost edge and go into the inner edge in the next iteration. Then the values of the index is compared with the other value in the same edge and the previous value in the outer edge.

[Edit]
Here is an alternative which does not use an array other than mat[100][100]:

#include <stdio.h>

int main() {

    int mat[100][100];
    int i, j;
    int ii, jj;                         // incremental values for i and j
    int n;
    int u, v, w;                        // variables to walk on edges
    int val;                            // value of the element
    int prev = -1;                      // previous value in one outer edge
    int length;                         // length of the edge

    // read matrix size and values
    printf("Enter the number:\n");
    scanf("%d", &n);

    printf("Enter the matrix:\n");
    for (i = 0; i < n; i  ) {
        for (j = 0; j < n; j  ) {
            scanf("%d", &mat[i][j]);
        }
    }

    // loop on the edges
    for (u = 0; u < n / 2; u  ) {       // from outmost edge to inner
        i = u; j = u;                   // index of the north west corner
        val = mat[u][u];                // initial value to compare
        for (v = 0; v < 4; v  ) {       // four sides
            ii = (v & 1) * ((v & 1) - (v & 2));
                                        //  assigned to {0, 1, 0, -1} in order
            jj = ((v   1) & 1) * (((v   1) & 1) - ((v   1) & 2));
                                        //  assigned to {1, 0, -1, 0} in order
            length = n - u * 2 - 1;     // length of the edge
            for (w = 0; w < length; w  ) {
                i  = ii;                // one step ahead on the edge
                j  = jj;                // same as above
                if (mat[i][j] != val || mat[i][j] <= prev) {
                    printf("No at [%d][%d] (val=%d)\n", i, j, mat[i][j]);
                    return 1;
                }
            }
        }
        prev = mat[i][j];
    }

    // finally examine the center value
    if (mat[u][u] <= prev) {
        printf("No at [%d][%d] (val=%d)\n", u, u, mat[u][u]);
        return 1;
    }

    printf("Yes\n");
    return 0;
}
  •  Tags:  
  • Related