# PBinfo #3856 – Scytale – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: Darius

## Enunț

Scytale
Cifrul Scytale functioneaza asa:

se da un mesaj cu n litere si un numar m;
mesajul trebuie asezat intr-o matrice cu m linii si n coloane;
pentru mesajul WEAREDISCOVEREDFLEEATONCE cu 25 de litere si numarul m=3, mesajul va fi pozitionat in matrice asa:

W . . E . . A . . R . . E . . D . . I . . S . . C
. O . . V . . E . . R . . E . . D . . F . . L . .
. . E . . E . . A . . T . . O . . N . . C . . E .



Cerinta
Dandu-se un numar c, mesajul si numarul m:

pentru c=1, sa se afiseze mesajul criptat
pentru c=2, sa se afiseze mesajul decriptat


Date de intrare
Fișierul de intrare scytale.in conține pe prima linie numărul c, mesajul si numarul m.

Date de ieșire
Fișierul de ieșire scytale.out va conține pe prima linie mesajul criptat sau decriptat, in functie de c.

Restricții și precizări

1 ≤ n*m ≤ 1000000
mesajul va contine numai litere mari

Exemplul 1:
scytale.in

1 WEAREDISCOVEREDFLEEATONCE 3
scytale.out

WOEEVEAEARRTEEODDNIFCSLEC
Exemplul 2:
scytale.in

2 WOEEVEAEARRTEEODDNIFCSLEC 3
scytale.out

WEAREDISCOVEREDFLEEATONCE

## Cod sursă C++

```cpp
#include <fstream>
using namespace std;
int main()
{
    ifstream cin("scytale.in");
    ofstream cout("scytale.out");
    string s;
    int cer,n,lin=0,col=0;
    cin>>cer>>s>>n;
    char f[n+5][s.size()+5];
    for(int i=0;i<n;i++)
        for(int j=0;j<s.size();j++)
            f[i][j]=0;
    if(cer==1)
    {
        for(int i=0;i<s.size();i++)
        {
            f[lin][col]=s[i];
            col+=n;
            if(col>=s.size())
                lin++,col=lin;
        }
        lin=col=0;
        for(int i=0;i<s.size();i++)
        {
            cout<<f[lin][col];
            if(lin<n-1)
                lin++,col++;
            else
                lin=0,col++;
        }
    }
    else
    {
        lin=col=0;
        for(int i=0;i<s.size();i++)
        {
            f[lin][col]=s[i];
            if(lin<n-1)
                lin++,col++;
            else
                lin=0,col++;
        }
        for(int i=0;i<n;i++)
            for(int j=0;j<s.size();j++)
                if(f[i][j]>='A' && f[i][j]<='Z')
                    cout<<f[i][j];
    }
    return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/3856)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/3856/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-3856/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
