#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; template istream& operator >> (istream& is, vector& vec){for(T& val: vec) is >> val; return is;} template istream& operator , (istream& is, T& val){ return is >> val;} template ostream& operator << (ostream& os, vector& vec){for(int i=0; i> field(50, vector(50, 0)); int x = 25; int y = 25; int dir = 0; auto update = [&](){ string s(buff); if(s=="Merry Christmas!") return -1; if(s=="20151224") return -2; int d; sscanf(buff, "%d", &d); field[x + (d+1)*dx[dir] ][ y + (d+1) * dy[dir] ] = 2; return d; }; auto check_foward = [&](){ return field[x + dx[dir] ][y + dy[dir]]; }; auto check_right = [&](){ return field[x + dx[(dir+1)%4]][y + dy[(dir+1)%4]]; }; auto check_left = [&](){ return field[x + dx[(dir+1)%4]][y + dy[(dir+1)%4]]; }; auto go_foward = [&](){ if(field[x + dx[dir]][y + dy[dir]] == 2) return; puts("F"); x += dx[dir]; y += dy[dir]; gets(buff); }; auto turn_right = [&](){ puts("R"); dir = (dir+1)%4; gets(buff); }; auto turn_left = [&](){ puts("L"); dir = (dir+3)%4; gets(buff); }; stack,int>> st; auto move_ = [&](){ vector>> last(50, vector>(50, {-1,-1})); queue> q; q.push(st.top().first); while(q.size()){ auto pos = q.front(); q.pop(); if(pos == st.top().first) break; //cerr << pos.first << " " << pos.second << " " << dir; int x_ = pos.first; int y_ = pos.second; for(int k__=0; k__<4; k__++){ int new_x = x_+ dx[k__]; int new_y = y_ + dy[k__]; if(field[new_x][new_y] != 1) continue; //do something if(last[new_x][new_y] == last[0][0] ){ last[new_x][new_y] = {x_,y_}; q.push({x_,y_}); } } } while(pair{x,y} != st.top().first){ auto p = last[x][y]; while(pair{x + dx[dir], y + dy[dir]} != p){ turn_right(); } go_foward(); } while(pair,int>{{x,y},dir} != st.top()){ turn_right(); } }; gets(buff); while(true){ int d = update(); if(d==-1) return 0; if(d==-2){ go_foward(); continue; } if(field[x][y] == 0){ field[x][y] = 1; for(int i=0; i<4; i++){ int z = check_foward(); if(z==0){ st.push({{x,y},dir}); //cerr << x << " " << y << " " << dir; } turn_right(); update(); } } if(st.top() == pair,int>{{x,y}, dir}){ st.pop(); go_foward(); continue; }else{ move_(); } //cerr << field << endl; } return 0; }