#include <iostream> #include <vector> #include <string> using namespace std; void PrintGrille(const vector<vector<char>> & grille) { for (size_t r = 0; r < grille.size(); ++r) { for (size_t c = 0; c < grille.size(); ++c) { cout << grille[r][c]; } cout << endl; } cout << endl; } vector<vector<char>> RotateGrille(const vector<vector<char>> & grille) { auto rv = grille; size_t cols = grille.size() -1; for(size_t r =0; r < grille.size(); ++r) { for (size_t c = 0; c < grille.size(); ++c) { rv[c][cols-r] = grille[r][c]; } } return rv; } bool DecodeString(string line, size_t & currentPos, string & plainText, string & covered, const vector<vector<char>> & grille) { for(size_t r =0; r < grille.size(); ++r) { for (size_t c = 0; c < grille.size(); ++c) { if (grille[r][c] == '.') { size_t pos = r*grille.size() + c; plainText[pos] = line[currentPos]; if (covered[pos] == 'X') { cout << "invalid grille" << endl; return false; } else { covered[pos] = 'X'; } currentPos++; } } } return true; } int main() { size_t size; cin >> size; if (size % 2 != 0) { cout << "invalid grille" << endl; return 0; } string codeWord; vector<vector<char>> grille(size, vector<char>(size)); for(size_t r =0; r < size; ++r) { for(size_t c = 0; c < size; ++c) { cin >> grille[r][c]; } } cin >> codeWord; size_t currentPos = 0; string covered = codeWord; string plainText = codeWord; for(size_t i = 0; i < 4; ++i) { if(not DecodeString(codeWord, currentPos, plainText, covered, grille)) { return 0; } grille = RotateGrille(grille); } covered = covered.substr(0,size*size); for (auto x: covered) { if (x != 'X') { cout << "invalid grille" << endl; return 0; } } cout << plainText << endl; return 0; }