Witam, mam problem z odszyfrowaniem słów. Mój kod zdaje się nie posiadać defektów, a mimo to nie przechodzi 100% testów. Z wyników wynika, że mój algorytm nie odszyfrowuje bezbłędnie słów o nieparzystej ilości liter. Dziwi mnie to, gdyż mój program działa dobrze dla moich testów (również tych, w których występują słowa o nieparzystej ilości liter). Byłbym wdzięczny za wskazanie błędu w kodzie, który odpowiada za niepoprawną analizę słów o nieparzystej ilości liter. Dziękuję z góry za komentarze, odpowiedzi :D.
Zadanie: link
Wyniki:
Kod:
#include <bits/stdc++.h>
using namespace std;
char arr[5][5]; //tablica liter
int row[200], col[200]; //tablica przechowuje rzad i kolumne znaku
bool let(char c) {
return (c >= 'A' and c <= 'Z'); //zwraca 1 (true), gdy znak jest duza litera
}
int main() {
string alp; //alfabet 25-literowy o duzych literach alfabetu lacinskiego (bez 'X')
cin >> alp;
for (int i = 0; i < 5; i ++) {
for (int j = 0; j < 5; j ++) {
arr[i][j] = alp[i * 5 + j]; //wczytanie liter do dwuwymiarowej tablicy arr
col[arr[i][j]] = j; //zapisanie kolumny litery
row[arr[i][j]] = i; //oraz wiersza
}
}
string str;
getline(cin, str); //pozbycie sie buforu z cin'a
getline(cin, str);
for (int i = 0; i < str.size() - 1; i ++) {
char x, y; //zmienne pomocnicze (x i y) zajmuja mniej miejsca w kodzie (zwiekszenie czytelnosci)
x = str[i];
y = str[i + 1];
if (!let(x) or !let(y)) //jesli x lub y nie jest litera (czyli jesli wystapila spacja)
continue;
if (row[x] == row[y]) {
str[i] = arr[row[x]][(col[x] + 4) % 5]; //przesuniecie o jeden w lewo czyli o cztery do przodu
str[i + 1] = arr[row[y]][(col[y] + 4) % 5];
} else if (col[x] == col[y]) {
str[i] = arr[(row[x] + 4) % 5][col[x]];
str[i + 1] = arr[(row[y] + 4) % 5][col[y]];
} else {
str[i] = arr[row[x]][col[y]];
str[i + 1] = arr[row[y]][col[x]];
}
i ++; //gdy poprawnie odszyfrowalem dwie litery przesuwam sie do przodu o jeden (petla for przesunie mi jeszcze o jeden czyli lacznie o dwa)
}
cout << str;
}