Ну вот вам код.
Предполагая, что вы правильно заполнили матрицу 5x5 в двумерном массиве mat[5, 5]
:
using namespace std;
string Encode(string cleartext)
{
string result;
char prev;
bool hasPrev = false;
for (char curr : cleartext)
{
if (!hasPrev) // ожидаем конца биграммы
{
prev = curr;
hasPrev = true;
continue;
}
char c1, c2;
// правило 1
if (prev == curr)
{
EncodePair(curr, 'X', result);
}
else
{
EncodePair(prev, curr, result);
hasPrev = false;
}
}
if (hasPrev)
EncodePair(prev, 'X', result);
return result;
}
void EncodePair(char prev, char curr, string& s)
{
Index idxPrev = indexByChar[prev];
Index idxCurr = indexByChar[curr];
assert(idxPrev.Row != idxCurr.Row ||
idxPrev.Col != idxCurr.Col);
Index resPrev, resNext;
if (idxPrev.Row == idxCurr.Row) // правило 2
{
resPrev = idxPrev.NextCol();
resNext = idxNext.NextCol();
}
else if (idxPrev.Col == idxCurr.Col) // правило 3
{
resPrev = idxPrev.NextRow();
resNext = idxNext.NextRow();
}
else // правило 4
{
resPrev = Index(idxPrev.Row, idxNext.Col);
resNext = Index(idxNext.Row, idxPrev.Col);
}
s += matrix[resPrev.Row, resPrev.Col];
s += matrix[resNext.Row, resNext.Col];
}
Вам придётся заполнить map<char, Index>
indexByChar
, чтобы по символу находить его строку и столбец в матрице (понятно, как?). Структура Index
очевидна:
struct Index
{
int Row;
int Col;
Index(int row, int col)
{
Row = row;
Col = col;
}
static Index NextRow()
{
int r = (Row + 1) % 5;
return Index(r, Col);
}
static Index NextCol()
{
int c = (Col + 1) % 5;
return Index(Row, c);
}
};