#include #include #include #include #include using namespace std; #define N 199 #define M 199 #define D 1 #define R 2 #define LEN (M + N - 2) int main(void) { int k, temp = 0; FILE* in = fopen("park.in", "rt"); fscanf(in, "%d", &k); fclose(in); int park[N][M]; for(int ii = 0; ii < N; ++ii) { for(int jj = 0; jj < M; ++jj) park[ii][jj] = '#'; } park[0][0] = '.'; int *path = new int[LEN]; for(int ii = 0; ii < N - 1; ++ii) { path[ii] = D; } for(int ii = N-1; ii < LEN; ++ii) { path[ii] = R; } // printf("%d", k); int blah = 1; while(true) { // apply current path int xx = 0, yy = 0, is_new = 0; for(int ii = 0; ii < LEN; ++ii) { if(path[ii] == D) { ++yy; } else { ++xx; } park[yy][xx] = '.'; } ++temp; if(temp == k) break; // DDDRRDRRR // DDRDRDRRR // DRDDRDRRR // RDDDRDRRR // RDDDRDRRR // DDDRRRDRR int dmoved, rmoved; // get next path // path generation has to be incremental, only one new path every time // hopefully the generated set will be large enough... int first = -1; if(path[0] == R) { int state = 0; for(int ii = 1; ii < LEN; ++ii) { if(state == 0) { if(path[ii] == D) { state = 1; continue; } } if (state == 1) { if(path[ii] == R) { path[0] = D; path[ii-1] = R; break; } } } for(int ii = LEN - 2; ii >= 0; ++ii) { if(path[ii] == D && path[ii + 1] == R) { path[ii] = R; path[ii+1] == D; break; } } } else { for(int ii = 1; ii < LEN; ++ii) { if(path[ii] == R && path[ii-1] == D) { path[ii - 1] = R; path[ii] = D; break; } } } } FILE* out = fopen("park.out", "wt"); fprintf(out, "%d %d\n", N, M); for(int ii = 0; ii < N; ++ii) { for(int jj = 0; jj < M; ++jj) fprintf(out, "%c", park[ii][jj]); fprintf(out, "\n"); } fclose(out); return 0; }