Informatică, întrebare adresată de balaurmatei1, 8 ani în urmă

Un şir de caractere se numeşte palindrom dacă se citeşte la fel de le stânga la dreapta şi de la dreapta la stânga, de exemplu "capac", "12321". Şirul se va numi palindrom ciclic dacă se transformă în palindrom prin o serie de permutări ciclice a elementelor sale. O permutare ciclică a elementelor şirului de caractere este deplasarea lor cu o poziţie spre stânga (în acest caz primul element trece în ultima poziţie) sau spre dreapta (ultimul element trece în prima poziţie) De exemplu, AABB se transformă în ABBA prin o singură permutare ciclică la stânga; 345432112 – prin două permutări ciclice la dreapta (23453211; 123454321) sau prin şapte permutări (454321123; 543211234; 432112345; 321123454; 211234543; 112345432; 123454321). Scrieţi un program, care să determine dacă un şir dat de caractere este un palindrom ciclic sau nu, precum şi numărul minim de permutări ciclice ale şirului de caractere, care îl transformă în palindrom. Date de intrare Fişierul de intrare palc1.in va conţine o singură linie pe care va fi scris şirul de caractere S. Date de ieşire Fişierul text palc1.out va conţine o singură linie pe care va fi scris un singur număr întreg: -1, dacă şirul de caractere S nu poate fi transformat în palindrom prin permutări ciclice, respectiv numărul minim de permutări ciclice care transformă şirul de caractere S în palindrom. Restricţii Lungimea şirului de caractere S <= 200 Şirul de caractere S poate conţine numai litere, cifre şi spaţii.

Răspunsuri la întrebare

Răspuns de lucaciucandrei
0

#include<stdio.h>

#include<string.h>

#define MIN(a,b) (a)<(b) ? (a):(b)

char siri[300];

char sirn[1000];

int pal(char *s,int n) {

  int i = 0;

  while(i<=n/2 && s[i] == s[n-i-1])

   i++;

   

  if(i>n/2) return 1;

  else return 0;

}

int n,r;

int main() {

freopen("palc1.in","r",stdin);

freopen("palc1.out","w",stdout);

 

while(scanf("%c",&siri[n]) != -1 && siri[n] != '\n'&&siri[n]!='\r')

 n++;

siri[n]='\0';

n = strlen(siri);

strcpy(sirn,siri);

strcpy(sirn+n,siri);

 

r=-1;

for(int i=0;i<n;i++)  

 if(pal(sirn+i,n))

  r= MIN(i,n-i);  

printf("%d",r);

fclose(stdin); fclose(stdout);

return 0;

}

Alte întrebări interesante