Quasi palindromi

Ho provato questo algoritmo su CodeBlocks ed e’ funzionante, quando faccio la verifica sul correttore degli allenamenti mi dice “lunghezza errata”.

#include <iostream>

using namespace std;

int M,N;
char rettangolo[8][8];
ifstream in("input.txt");
ofstream out("output.txt");

bool palindromic(){
    for (int i = 0; i < N; i++)
        for(int j=0; j < M/2; j++){
            if ((rettangolo[i][j] != rettangolo[M-i-1][i]) && (rettangolo[i][j] != '0') && (rettangolo[M-i-1][i] != '0'))
                return false;
        }
    return true;
}

void stampa(int num){
    for (int i = 0; i <= num; i++)
        out << rettangolo[i] << endl;
}

void trovaPermutazioni(int inizio, int fine){
    int j;
    if (inizio >= fine){
        if (palindromic()){
            stampa(fine);
            exit(0);
        }
    }
    else{
        for (j = inizio; j <= fine; j++){
            swap(rettangolo[inizio], rettangolo[j]);
            trovaPermutazioni(inizio+1, fine);
            swap(rettangolo[inizio], rettangolo[j]);
        }
    }
}


int main()
{
    in >> M >> N;
    for (int i = 0; i < M; i++){
        char temp[10];
        in >> temp;
        for (int j = 0; j < N; j++){
            rettangolo[i][j] = temp[j];
        }
    }
    trovaPermutazioni(0, M-1);

    return 0;
}

Penso che il problema sia in:

out << rettangolo[i] << endl;

Questa istruzione comincia a stampare rettangolo[i][0] e si ferma solo quando incontra il carattere terminatore \0.

Essendo dichiarato globalmente, rettangolo sarà inizializzato al valore di default (che per char è \0) cosa che non sarebbe vera se fosse stato dichiarato dentro la main (sullo stack). Tuttavia, se le stringhe memorizzate in rettangolo assumono lunghezza 8, non hai più il carattere terminatore. Per esempio:

rettangolo[i] = {\0, \0, \0, \0, \0, \0, \0, \0, spazzatura, spazzatura, ...}

dove in spazzatura può in teoria esserci qualsiasi cosa (in pratica, è probabile che ci sia l’inizio del rettangolo[i+1], ma sono dettagli :stuck_out_tongue:).

Se scrivi in rettangolo così:

rettangolo[i] = {1, 2, 3, 4, 5, \0, \0, \0, spazzatura, spazzatura, ...}

allora l’istruzione incriminata stamperà “1”, “2”, “3”, “4”, “5” e poi incontrerà \0 e si fermerà.

Se invece scrivi 8 caratteri, la funzione continuerà a stampare caratteri (spazzatura) finché non trova uno \0.

1 Mi Piace

ok grazie mille, ho risolto, mi ha dato il 100/100 :slightly_smiling:
c’era anche un problema con gli indici della funzione palindromo, ho invertito i con j nel rettangolo. Problema risolto

1 Mi Piace