#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); //~ for (unsigned int i = 0; i < v.size(); i++) //~ printf ("%d, %d\n" , v[i].x, v[i].y); //~ printf("\n"); } int main(int argc, char *argv[]) { argc = argc; argv = argv; char ciph[BUFLEN][BUFLEN]; while(true) { int size; vector grille; char buffer[BUFLEN]; fgets(buffer, BUFLEN, stdin); sscanf(buffer, "%d", &size); if (size == 0) break; for (int i = 0; i < size; i++) { fgets(buffer, BUFLEN, stdin); // sscanf(buffer, "%d", &nCases); for (int j =0; j != '\n'; j++) if (buffer[j] == '0') grille.push_back((co){i, j}); } //~ for (unsigned int i = 0; i < grille.size(); i++) //~ printf ("%d, %d\n" , grille[i].x, grille[i].y); //~ printf("\n"); for (int i = 0; i < size; i++) { fgets(ciph[i], BUFLEN, stdin); } char result[BUFLEN]; int index = 0; for (int k = 0; k < 4; k++) { for (unsigned int i = 0; i < grille.size(); i++) { result[index] = ciph[grille[i].x][grille[i].y]; index++; } rotate(grille, size); } int delka = strlen(result); for (int i = 0; i < delka; i++) printf("%c", result[i]); printf("\n"); } return 0; }