#include #include #include #include #include #include #include using namespace std; #define BUFLEN 1024 struct co { int x; int y; }; bool sortfunc(co a, co b) { if (a.x > b.x) return false; if (a.x < b.x) return true; return a.y < b.y; } void rotate(vector &v, int N) { struct co aux; aux.x = v[v.size()-1].y; aux.y = N - 1 - v[v.size()-1].x; for (unsigned int i = v.size() - 1; i > 0; i--) { v[i].x = v[i-1].y; v[i].y = N - 1 - v[i-1].x; } v[0].x = aux.x; v[0].y = aux.y; sort(v.begin(), v.end(), sortfunc); } int main(int argc, char *argv[]) { argc = argc; argv = argv; char buffer[BUFLEN]; char *ciph = new char[BUFLEN * BUFLEN]; char *result = new char[BUFLEN * BUFLEN * 4]; while(true) { int size; vector grille; fgets(buffer, BUFLEN, stdin); sscanf(buffer, "%d", &size); if (size == 0) break; for (int i = 0; i < size; i++) { fgets(buffer, BUFLEN, stdin); for (int j =0; (buffer[j] != '\n') && (buffer[j] != '\0'); j++) if (buffer[j] == '0') grille.push_back((co){i, j}); } for (int i = 0; i < size; i++) { fgets(&(ciph[BUFLEN*i]), BUFLEN, stdin); } int index = 0; for (int k = 0; k < 4; k++) { for (unsigned int i = 0; i < grille.size(); i++) { result[index] = ciph[BUFLEN * grille[i].x + grille[i].y]; index++; } rotate(grille, size); } result[index] = '\0'; printf("%s\n", result); } return 0; }