Advertisement
KarlFAKremen

[ACM] Common Code Handler

Jan 7th, 2017
261
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.50 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. // flags
  4. #define FILE "alarm"
  5. #define USE_FREOPEN 1
  6. #define USE_LONG 0
  7. #define USE_IOSOPT 0
  8.  
  9. // typedefs
  10. #if USE_LONG
  11. typedef int64_t ll;
  12. typedef uint64_t ull;
  13. #else
  14. typedef int32_t ll;
  15. typedef uint32_t ull;
  16. #endif
  17.  
  18. // links
  19. #define rl double
  20. #define pb push_back
  21. #define mp make_pair
  22. #define fi first
  23. #define f first
  24. #define x first
  25. #define se second
  26. #define s second
  27. #define y second
  28. #define rm erase
  29. #define ins insert
  30. #define sz size
  31. #define elsif else if
  32. #define next continue
  33. #define xb pop_back
  34. #define hset unordered_set
  35. #define hmap unordered_map
  36.  
  37. // macros
  38. #define rs(a) resize((a))
  39. #define p(a, b) pair < a, b >
  40. #define sq(x) (x * x)
  41. #define lsq(x) (x * 1ll * x)
  42. #define unless(a) if(!(a))
  43. #define skip(a) if(a) next;
  44. #define fail(a) if(a) break;
  45. #define skipn(a) unless(a) next;
  46. #define failn(a) unless(a) break;
  47. #define rev(a) reverse(a.begin(), a.end())
  48. #define ord(a) sort(a.begin(), a.end())
  49. #define printv(a) { for(auto ___cur___ : a) { cout << ___cur___ << ' '; }; cout << endl; }
  50. #define printd(a) { for(auto ___cur___ : a) { cerr << ___cur___ << ' '; }; cerr << endl; }
  51. #define die(a) \
  52. { \
  53. cout << (a) << endl; \
  54. exit(0); \
  55. }
  56.  
  57. using namespace std;
  58.  
  59.  
  60. const size_t $MAXN = (ull) (2000);
  61. const char *$SIGNATURE[] = {"b9", "91", "af", "fc",
  62.                             "fb", "24", "db", "04",
  63.                             "76", "fe", "95", "76",
  64.                             "b9", "03", "95", "2e"};
  65. const ull $MOD = (const ull) (1e9 + 7);
  66.  
  67. ll nextInt( )
  68. {
  69.     ll d;
  70.     cin >> d;
  71.     return d;
  72. }
  73.  
  74. string nextString( )
  75. {
  76.     string d;
  77.     cin >> d;
  78.     return d;
  79. }
  80.  
  81. char nextChar( )
  82. {
  83.     char d;
  84.     cin >> d;
  85.     return d;
  86. }
  87.  
  88. bool isPair(char l, char r)
  89. {
  90.     return (
  91.             l == '(' && r == ')' or
  92.                         l == '[' && r == ']'
  93.     );
  94. }
  95.  
  96. string slurp(string filename)
  97. {
  98.     ifstream in(filename);
  99.     stringstream str;
  100.     str << in.rdbuf( );
  101.     return str.str( );
  102. }
  103.  
  104.  
  105. vector < string > split(const string &hay, const char &delim, const char &delim2 = '\0')
  106. {
  107.     vector < string > answer;
  108.     string buffer;
  109.     for(auto chr : hay)
  110.     {
  111.         if(chr == delim || chr == delim2)
  112.         {
  113.             answer.pb(buffer);
  114.             buffer = "";
  115.         } else
  116.             buffer.pb(chr);
  117.     }
  118.     answer.pb(buffer);
  119.     return answer;
  120. }
  121.  
  122. inline bool isEven(const string &number)
  123. {
  124.     char last = (*number.rbegin( )) - '0';
  125.     return (last % 2 == 0);
  126. }
  127.  
  128.  
  129. string operator*(string a, int b)
  130. {
  131.     string res = "";
  132.     while(b--)
  133.         res += a;
  134.     return res;
  135. }
  136.  
  137. bool isPali(const string &a)
  138. {
  139.     ll n = (ll) a.sz( );
  140.     for(int i = 0; i < (ll) n; i++)
  141.         if(a[i] != a[n - i - 1])
  142.             return 0;
  143.     return 1;
  144. }
  145.  
  146. ll countPairs(ll n)
  147. {
  148.     return
  149.             n * (n + 1)
  150.             / 2;
  151. }
  152.  
  153. ll makeNumPair(ll a, ll b)
  154. {
  155.     return a * 10000 + b;
  156. }
  157.  
  158. string getStringOrInt( )
  159. {
  160.     return (rand( ) % 2 ? "string" : 0);
  161. }
  162.  
  163. struct trio {
  164.     ll a, b, c;
  165. };
  166.  
  167. string toLower(string src)
  168. {
  169.     string tmp = src;
  170.     transform(tmp.begin( ), tmp.end( ), tmp.begin( ), ::tolower);
  171.     return tmp;
  172. }
  173.  
  174. void solve( );
  175.  
  176. int main( )
  177. {
  178.     // ios{
  179. #if USE_IOSOPT
  180.     ios_base::sync_with_stdio(false);
  181.     cin.tie(0);
  182. #endif
  183. #if USE_FREOPEN
  184.     freopen("input.txt", "r", stdin);
  185.     freopen("output.txt", "w", stdout);
  186. #endif
  187.     solve( );
  188.     return 0;
  189. }
  190.  
  191. bool mx[$MAXN][$MAXN];
  192.  
  193. p(ll, ll) spos = {-1, -1};
  194. ll k;
  195. ll n, m;
  196.  
  197. bool canGo(const p(ll, ll) & pt)
  198. {
  199.     if(pt.fi >= n || pt.se >= m)
  200.         return false;
  201.     if(pt.fi < 0 || pt.se < 0)
  202.         return false;
  203.  
  204.     return (mx[pt.x][pt.y]);
  205. }
  206.  
  207.  
  208. bool checkPath(const string & path)
  209. {
  210.     ll x = 0, y = 0;
  211.     if(path.sz( ) != k)
  212.         return 0;
  213.     for(auto ch : path)
  214.     {
  215.         switch(ch)
  216.         {
  217.             case 'D':
  218.                 x++;
  219.                 break;
  220.             case 'U':
  221.                 x--;
  222.                 break;
  223.             case 'L':
  224.                 y--;
  225.                 break;
  226.             case 'R':
  227.                 y++;
  228.                 break;
  229.             default:
  230.                 break;
  231.         }
  232.     }
  233.  
  234.     if(x != 0 || y != 0)
  235.         return 0;
  236.     return 1;
  237. }
  238.  
  239.  
  240. void dfs(const p(ll, ll) & v, const string & way = "")
  241. {
  242.     if(way.sz( ) > k)
  243.         return;
  244.     if(checkPath(way))
  245.     die(way);
  246.     if(canGo({v.fi + 1, v.se}))
  247.         dfs({v.fi + 1, v.se}, way + "D");
  248.     if(canGo({v.fi, v.se - 1}))
  249.         dfs({v.fi, v.se - 1}, way + "L");
  250.     if(canGo({v.fi, v.se + 1}))
  251.         dfs({v.fi, v.se + 1}, way + "R");
  252.     if(canGo({v.fi - 1, v.se}))
  253.         dfs({v.fi - 1, v.se}, way + "U");
  254. }
  255.  
  256. void solve( )
  257. {
  258.     cin >> n >> m >> k;
  259.  
  260.     assert(!(k & 1));
  261.  
  262.     for(int i = 0; i < n; i++)
  263.     {
  264.         for(int j = 0; j < m; j++)
  265.         {
  266.             char c;
  267.             cin >> c;
  268.             if(c == '.')
  269.                 mx[i][j] = 1;
  270.             if(c == 'X')
  271.             {
  272.                 mx[i][j] = 1;
  273.                 spos = {i, j};
  274.             }
  275.         }
  276.     }
  277.  
  278.     dfs(spos);
  279.  
  280.     die("IMPOSSIBLE\n");
  281. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement