Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.56 KB | None | 0 0
  1. #include <cstdio>
  2. #include <queue>
  3.  
  4. using namespace std;
  5.  
  6. const int MAXN = 110;
  7. const int MAXT = 8;
  8. int ar[MAXN][MAXN][1 << MAXT][4];
  9. bool vis[MAXN][MAXN][1 << MAXT][4];
  10. /*
  11. struct tmp {
  12. int x;
  13. int y;
  14. int t;
  15. int d;
  16. tmp() {};
  17. tmp(int a,int b,int c,int e) {
  18. x = a;
  19. y = b;
  20. t = c;
  21. d = e;
  22. }
  23. };
  24. tmp from[MAXN][MAXN][1 << MAXT][4];
  25. */
  26. int treasure[MAXN][MAXN];
  27. int grid[MAXN][MAXN];
  28. queue<int> xq,yq,tq,dq;
  29. int X,Y,T;
  30. void visit(int x, int y, int t, int d, int dist) {
  31. if (x >= 0 && y >= 0 && x < X && y < Y) {
  32. if (treasure[x][y]) {
  33. t |= 1 << (treasure[x][y] - 1);
  34. }
  35. if (!vis[x][y][t][d]) {
  36. vis[x][y][t][d] = true;
  37. ar[x][y][t][d] = dist;
  38. xq.push(x);
  39. yq.push(y);
  40. tq.push(t);
  41. dq.push(d);
  42.  
  43. // from[x][y][t][d] = tmp(xq.front(),yq.front(),tq.front(),dq.front());
  44. }
  45. }
  46. }
  47. int mx[4] = {-1,0,1,0},my[4] = {0,1,0,-1};
  48. int next() {
  49. int x = xq.front();
  50. int y = yq.front();
  51. int t = tq.front();
  52. int d = dq.front();
  53. int dist = ar[x][y][t][d];
  54. //printf("At x=%d,y=%d,t=%d,d=%d,dist=%d\n",x,y,t,d,dist);
  55. int dir = (grid[x][y] + d) % 4;
  56. visit(x + mx[dir], y + my[dir], t, (d + 1) % 4, dist + 1);
  57. visit(x, y, t, (d + 1) % 4, dist + 1);
  58. xq.pop();
  59. yq.pop();
  60. tq.pop();
  61. dq.pop();
  62. }
  63. void reset() {
  64. for(int x = 0; x < X; ++x) {
  65. for(int y = 0; y < Y; ++y) {
  66. for(int t = 0; t < (1 << T); ++t) {
  67. for(int d = 0; d < 4; ++d) {
  68. vis[x][y][t][d] = false;
  69. }
  70. }
  71. treasure[x][y] = 0;
  72. }
  73. }
  74. }
  75. char buf[1234567];
  76. bool read() {
  77. scanf("%d %d", &X, &Y);
  78. return !(X == 0 && Y == 0);
  79. }
  80. int conv(char c) {
  81. switch(c) {
  82. case 'N': return 0;
  83. case 'E': return 1;
  84. case 'S': return 2;
  85. case 'W': return 3;
  86. }
  87. return -1;
  88. }
  89. int main() {
  90. while(read()) {
  91. reset();
  92. for(int x = 0; x < X; ++x) {
  93. scanf("%s",buf);
  94. for(int y = 0; y < Y; ++y) {
  95. char c = buf[y];
  96. grid[x][y] = conv(c);
  97. }
  98. }
  99. scanf("%d", &T);
  100. for(int i = 0; i < T; ++i) {
  101. int x, y;
  102. scanf("%d %d", &x, &y);
  103. x--;
  104. y--;
  105. treasure[x][y] = i + 1;
  106. }
  107. visit(0, 0, 0, 0, 0);
  108. while(xq.size()) {
  109. next();
  110. }
  111. int des = (1 << T) - 1;
  112. int m = -1;
  113. int bd = 0;
  114. for(int d = 0; d < 4; ++d) {
  115. if (vis[X - 1][Y - 1][des][d]) {
  116. int k = ar[X - 1][Y - 1][des][d];
  117. if (m == -1 || k < m) {
  118. m = k;
  119. bd = d;
  120. }
  121. }
  122. }
  123. printf("%d\n", m);
  124. // tmp t = tmp(X-1,Y-1,des,bd);
  125. // while(t.x != 0 || t.y != 0 || t.d != 0 || t.t != 0) {
  126. // printf("x: %d y: %d time: %d\n",t.x,t.y,ar[t.x][t.y][t.t][t.d]);
  127. // t = from[t.x][t.y][t.t][t.d];
  128. // }
  129. }
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement