Se potessi spiegare brevemente cosa fa il tuo codice sarebbe più semplice aiutarti, in ogni caso dando un’occhiata veloce mi pare che tu non stai provando tutte le permutazioni delle stringhe.
Il codice legge la matrice
Per ogni riga salva tutti i numeri della stessa colonna in una stringa
Controlla se la stringa è un numero palindromo
Se tutte le stringhe sono numeri palindromi stampa la matrice
Altrimenti controllo una nuova configurazione: porto l’ultima riga sempre più in alto e, quando diventa la prima, ricomincio con l’ultima (in questo modo dovrei provare tutte le permutazioni)
In realtà questo è vero solo se hai N<=3 elementi da permutare, già con N=4 ti accorgi che in realtà provi solo N*(N-1) configurazioni:
ABCD, ABDC, ADBC
DABC, DACB, DCAB
CDAB, CDBA, CBDA
BCDA, BCAD, BACD
A questo punto la prossima configurazione generata dal tuo algoritmo sarà ABCD che è stata già visitata, quindi se il tuo programma non trova un rettangolo palindromo tra una delle N*(N-1) configurazioni generate vai a finire in un loop (il che spiega i TLE).
Hai ragione
Ho trovato questo interessante programma per le permutazioni di una stringa ma non riesco ad adattarlo al problema. Qualche idea?
#include <stdio.h>
#include <string.h>
//prototipi di funzione
void Swap(char* string,int i,int j);
void Permutations(char *string,int i ,int n);
void main()
{
char s[256];//poi per lungezze maggiori ti arrangi tu ma tanto il tempo di esecuzione
//cresce col fattoriale e non conviene esagerare con la lungezza....
printf("Dammi la stringa (max 255 caratteri):");
scanf("%s",s);
Permutations(s,0,(int)strlen(s)-1);
}
//Genera ricorsivamente le permutazioni
void Permutations(char *string,int i ,int n)
{
int j;
if(i==n)
{
for(j=0;j<=n;j++)
printf("%c",string[j]);
printf("\n");
}
else
{
for( j = i ; j<=n ; j++ )
{
Swap(string,i,j);
Permutations(string,i+1,n);
Swap(string,i,j);
}
}
}
//Effettua un semplice scambio di posizione
void Swap(char* string,int i,int j)
{
int temp;
temp = string[i];
string[i] = string[j];
string[j] = temp;
}
Secondo me il modo più rapido per permutare gli elementi di un array è salvarsi degli oggetti di tipo string in un array e poi utilizzare la funzione “next_permutation” della libreria algorithm.
Ecco qui un esempio: https://pastebin.com/PDTf9K8W