Verificar matriz inca

Bom estava estudando a linguagem C em uma apostila que consegui na net…eis uma questão que não consegui resolver:

Neste problema você deverá fazer um programa que recebe uma matriz quadrada An x n de números inteiros e verifica se a matriz é inca, ou seja, se partindo do canto superior esquerdo da matriz, no sentido horário, em espiral, a posição seguinte na ordem é o inteiro consecutivo da posição anterior.

Exemplo: A matriz abaixo é inca:

Consigo resolver o problema caso as dimensões da matriz sejam conhecidas por mim, como 4x4 ou 5x5, mas como fazer uma lógica pra quaisquer dimensões inseridas?

Bom vou continuar tentando…

Se alguém tiver uma idéia.

obs.: N quero a resolução, mas uma idéia de como resolver.

Grato,

PH.

Trate a matriz como uma série de “quadrados”:

Quadrado 1: 4x4

1 2 3 4 12 5 11 6 10 9 8 7

Quadrado 2: 2x2

13 14 16 15

A dimensão do quadrado seguinte é sempre duas unidades menor que a dimensão do quadrado anterior.
Crie o algoritmo para percorrer um quadrado de dimensão x. Percorra os quadrados de dimensão x-2, x-4, x-n, até que x-n seja igual a 0 (caso a dimensão seja par) ou seja igual a 1 (dimensão impar).

Haveria um jeito mais simples de percorrer um quadrado sem o uso de muitos laços?

Por exemplo,no primeiro quadro da serie 4x4 gastei 4 laços for =/

Realmente você vai usar 4 laços, um para cada lado do quadrado. Pode até ser possível usar menos laços, mas o seu código vai ficar bem difícil de ler.
Já que você já começou, vou postar o que eu fiz.

[code]#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

struct prop_matriz {
int *matriz;
int tamanho;
char *descricao;
};

bool ehInca( int *m[], int t );

int main( void ) {

int m1[4][4] = {
    { 1, 2, 3, 4 },
    { 12, 13, 14, 5 },
    { 11, 16, 15, 6 },
    { 10, 9, 8, 7 }
};

int m2[5][5] = {
    { 1, 2, 3, 4, 5 },
    { 16, 17, 18, 19, 6 },
    { 15, 24, 25, 20, 7 },
    { 14, 23, 22, 21, 8 },
    { 13, 12, 11, 10, 9 }
};

int m3[6][6] = {
    { 1, 2, 3, 4, 5, 6 },
    { 20, 21, 22, 23, 24, 7 },
    { 19, 32, 33, 34, 25, 8 },
    { 18, 31, 36, 35, 26, 9 },
    { 17, 30, 29, 28, 27, 10 },
    { 16, 15, 14, 13, 12, 11 }
};

struct prop_matriz matrizes[] = {
    { .matriz = &m1, .tamanho = 4, .descricao = "matriz 1" },
    { .matriz = &m2, .tamanho = 5, .descricao = "matriz 2" },
    { .matriz = &m3, .tamanho = 6, .descricao = "matriz 3" },
    { .matriz = NULL }
};

int i = 0;

while ( matrizes[i].matriz != NULL ) {

    printf( "\"%s\" eh inca? %s\n",
           matrizes[i].descricao,
           ehInca( matrizes[i].matriz, matrizes[i].tamanho ) ? "sim" : "nao" );

    i++;

}

return EXIT_SUCCESS;

}

bool ehInca( int *m[], int t ) {

int i;
int j;

int (*p)[t] = m;
int cont = (*p)[0];

int inicio = 0;
int fim = t;

while ( inicio != fim ) {

    for ( i = inicio; i < fim; i++ ) {
        if ( cont == (*p)[i] ) {
            cont++;
        } else {
            return false;
        }
    }

    i--;

    for ( j = inicio + 1; j < fim; j++ ) {

        p++;

        if ( cont == (*p)[i] ) {
            cont++;
        } else {
            return false;
        }

    }

    i--;
    j--;

    for ( ; i >= inicio; i-- ) {
        if ( cont == (*p)[i] ) {
            cont++;
        } else {
            return false;
        }
    }

    i++;
    j--;

    for ( ; j > inicio; j-- ) {

        p--;

        if ( cont == (*p)[i] ) {
            cont++;
        } else {
            return false;
        }

    }

    if ( inicio == fim - 1 ) {
        break;
    }

    inicio++;
    fim--;

}

return true;

}[/code]
[]´s