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