Advertisement
a53

spider

a53
Jul 4th, 2020
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.52 KB | None | 0 0
  1. #define TuTTy "Cosmin-Mihai Tutunaru"
  2. #include <cstdio>
  3. #include <vector>
  4. #include <algorithm>
  5. #define infile "spider.in"
  6. #define outfile "spider.out"
  7. #define nMax 1013
  8.  
  9. using namespace std;
  10.  
  11. #define point pair <int, int>
  12. point outside = make_pair(-1, -1);
  13.  
  14. const int ii[] = {-1, 0, 1, 0};
  15. const int jj[] = {0, 1, 0, -1};
  16.  
  17. int best[nMax][nMax][5];
  18. int h[nMax][nMax];
  19. int n, m;
  20.  
  21. point sol;
  22. int steps;
  23.  
  24. inline bool valid(point p) {
  25. if (p.first < 1 || p.first > n) return false;
  26. if (p.second < 1 || p.second > m) return false;
  27. return true;
  28. }
  29.  
  30. inline int getHeight(point p) {
  31.  
  32. if (p == outside) {
  33. return -1;
  34. }
  35.  
  36. return h[p.first][p.second];
  37. }
  38.  
  39. pair<point, int> getNextPosition(point crt, point prv) {
  40.  
  41. point ret = outside;
  42. int dir = -1;
  43.  
  44. for (int t = 0; t < 4; ++t) {
  45. point nxt = make_pair(crt.first + ii[t], crt.second + jj[t]);
  46. if (nxt != prv && valid(nxt) && getHeight(ret) < getHeight(nxt) && getHeight(nxt) <= getHeight(crt)) {
  47. ret = nxt;
  48. dir = t;
  49. }
  50. }
  51.  
  52. return make_pair(ret, dir);
  53. }
  54.  
  55. void read() {
  56.  
  57. scanf("%d %d\n", &n, &m);
  58.  
  59. for (int i = 0; i < n; ++i) {
  60. for (int j = 0; j < m; ++j) {
  61. scanf("%d", &h[i+1][j+1]);
  62. }
  63. }
  64. }
  65.  
  66. int solve(int x, int y, int d) {
  67.  
  68. if (best[x][y][d]) {
  69. return best[x][y][d];
  70. }
  71.  
  72. best[x][y][d] = 1;
  73. point prv;
  74.  
  75. if (d == 4) {
  76. prv = outside;
  77. } else {
  78. prv = make_pair(x + ii[d], y + jj[d]);
  79. }
  80.  
  81. pair<point, int> nxt = getNextPosition(make_pair(x, y), prv);
  82.  
  83. if (nxt.first != outside) {
  84. best[x][y][d] += solve(nxt.first.first, nxt.first.second, (nxt.second + 2) % 4);
  85. }
  86.  
  87. return best[x][y][d];
  88. }
  89.  
  90. void solve() {
  91.  
  92. for (int i = 0; i < n; ++i) {
  93. for (int j = 0; j < m; ++j) {
  94. int dist = solve(i+1, j+1, 4);
  95. if (dist > steps) {
  96. steps = dist;
  97. sol = make_pair(i+1, j+1);
  98. }
  99. }
  100. }
  101.  
  102. }
  103.  
  104. void write() {
  105.  
  106. printf("%d\n", steps - 1);
  107.  
  108. point prv = outside;
  109.  
  110. while(sol != outside) {
  111. printf("%d %d\n", sol.first, sol.second);
  112. point aux = getNextPosition(sol, prv).first;
  113.  
  114. prv = sol;
  115. sol = aux;
  116. }
  117. }
  118.  
  119. int main() {
  120. freopen(infile, "r", stdin);
  121. freopen(outfile, "w", stdout);
  122.  
  123. read();
  124. solve();
  125. write();
  126.  
  127. fclose(stdin);
  128. fclose(stdout);
  129. return 0;
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement