fork download
  1. typedef long long ll;
  2. typedef unsigned long long ull;
  3.  
  4. #include <iostream>
  5. #include <stdio.h>
  6. #include <memory.h>
  7. #include <algorithm>
  8. #include <vector>
  9. #include <cmath>
  10. #include <bitset>
  11. #include <string>
  12. #include <cstring>
  13. #include <iomanip>
  14. #include <valarray>
  15. #include <sstream>
  16. #include <fstream>
  17. #include <functional>
  18. #include <utility>
  19. #include <numeric>
  20. #include <iterator>
  21. #include <set>
  22. #include <map>
  23. #include <queue>
  24. using namespace std;
  25.  
  26. #define sz(v) (int)v.size()
  27. #define rsz(v,r) v.resize(r)
  28. #define clr(v) v.clear()
  29. #define vi vector<int>
  30. #define ii pair<int, int>
  31. #define vvi vector<vector<int>>
  32. #define vb vector<bool>
  33. #define vvb vector<vector<bool>>
  34. #define vc vector<char>
  35. #define vvc vector<vector <char> >
  36. #define vs vector<string>
  37. #define lop(i,n) for(int i=0; i<n; i++)
  38. #define rlop(i,n) for(int i=n-1; i>=0; i--)
  39. #define loop(i,start,n) for(int i=start; i<n; i++)
  40. #define rloop(i,start,n) for(int i=n-1; i>=end; i--)
  41. #define in(u) int u; cin>>u;
  42. #define inc(u) char u; cin>>u;
  43.  
  44.  
  45. int width, hight;
  46. int xi, yi;
  47. vvc graph;
  48. bool visi[10][10];
  49. char dirc;
  50. int curr = 0;
  51.  
  52. void find(char c)
  53. {
  54. if (c == 'U')
  55. {
  56. xi = -1;
  57. yi = 0;
  58. }
  59. else if (c =='R')
  60. {
  61. xi = 0;
  62. yi = 1;
  63. }
  64. else if (c == 'D')
  65. {
  66. xi = 1;
  67. yi = 0;
  68. }
  69. else if (c=='L')
  70. {
  71. xi = 0;
  72. yi = -1;
  73. }
  74. else
  75. {
  76. xi = 0;
  77. yi = 0;
  78. }
  79. }
  80.  
  81. bool ill(int i, int j)
  82. {
  83. return (i > -1 && j > -1 && i < hight &&j < width && graph[i][j] !='*');
  84. }
  85.  
  86. void changedic()
  87. {
  88. if (dirc == 'U')
  89. dirc = 'R';
  90. else if (dirc == 'R')
  91. dirc = 'D';
  92. else if (dirc == 'D')
  93. dirc = 'L';
  94. else dirc = 'U';
  95. }
  96.  
  97. void dfs(int i, int j)
  98. {
  99. if (visi[i][j] && graph[i][j] == dirc)
  100. return;
  101. if (!visi[i][j])
  102. {
  103. curr++;
  104. visi[i][j] = true;
  105. }
  106.  
  107. lop(k,4)
  108. {
  109. find(dirc);
  110. if (ill(i+xi,j+yi))
  111. {
  112. int x = xi;
  113. int y = yi;
  114. find(graph[i+x][j+y]);
  115. if (x + xi != 0 || y + yi != 0 )
  116. {
  117. graph[i][j] = dirc;
  118. dfs(i + x, j + y);
  119. break;
  120. }
  121. }
  122. changedic();
  123. }
  124. }
  125.  
  126.  
  127.  
  128. int main()
  129. {
  130. cin >> hight >> width;
  131. rsz(graph, hight);
  132. lop(i, hight)
  133. {
  134. lop(j, width)
  135. {
  136. inc(u);
  137. graph[i].push_back(u);
  138. visi[i][j] = false;
  139. if (u != '.'&& u != '*')
  140. {
  141. xi = i;
  142. yi = j;
  143. dirc = u;
  144. }
  145. }
  146. }
  147. dfs(xi, yi);
  148. cout << curr << endl;
  149.  
  150. }
  151.  
Success #stdin #stdout 0s 15240KB
stdin
3 4
***D
..*.
*...
stdout
7