Advertisement
Guest User

Untitled

a guest
May 30th, 2020
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.80 KB | None | 0 0
  1. ll n,m;
  2. bool board[3000][3000];
  3. int parent[3000][3000];
  4. pl a;
  5. queue<pl> q;
  6. ll visited[3000][3000], visited1[3000][3000];
  7. void reconstruct_path(ll x, ll y){
  8. string path="";
  9. // cout<<"HERE"<<'\n';
  10. // exit(0);
  11. while(make_pair(x, y)!=a){
  12. // dbg(x, y);
  13. if(parent[x][y]==1){
  14. //we went right so go left
  15. path+='R';
  16. y--;
  17. }
  18. else if(parent[x][y]==2){
  19. path+='L';
  20. y++;
  21. }
  22. else if(parent[x][y]==3){
  23. x++;
  24. path+='U';
  25. }
  26. else if(parent[x][y]==4){
  27. x--;
  28. path+='D';
  29. }
  30. }
  31. reverse(all(path));
  32. cout<<int(path.size())<<"\n"<<path<<'\n';
  33. }
  34. int main(){setIO("");
  35. re(n, m);
  36. for(int i=1;i<=n;i++){
  37. for(int j=1;j<=m;j++){
  38. visited[i][j]=visited1[i][j]=1e9+7;
  39. char c;
  40. re(c);
  41. if(c=='#'){
  42. board[i][j]=0;
  43. }
  44. if(c=='A'){
  45. a={i, j};
  46. visited[i][j]=0;
  47. board[i][j]=1;
  48. }
  49. if(c=='.'){
  50. board[i][j]=1;
  51. }
  52. if(c=='M'){
  53. visited1[i][j]=0;
  54. q.push({i, j});
  55. board[i][j]=1;
  56. }
  57. }
  58. }
  59. //multisource bfs
  60. while(q.size()){
  61. ll x=q.front().f, y=q.front().s;q.pop();
  62. // dbg(x, y);
  63. int dx[]={1, -1, 0, 0};
  64. int dy[]={0, 0, 1, -1};
  65. for(int i=0;i<4;i++){
  66. ll x1=x+dx[i], y1=y+dy[i];
  67. if(x1>=1 and x1<=n and y1>=1 and y1<=m and board[x1][y1] and visited1[x][y]+1<=visited1[x1][y1]){
  68. visited1[x1][y1]=1+visited1[x][y];
  69. q.push({x1, y1});
  70. }
  71. }
  72. }
  73. q=queue<pl>();
  74. q.push(a);
  75. while(q.size()){
  76. ll x=q.front().f, y=q.front().s;
  77. // dbg(x, y);
  78. q.pop();
  79. if(x==1 or x==n or y==1 or y==m){
  80. cout<<"YES"<<'\n';
  81. reconstruct_path(x, y);
  82. return 0;
  83. }
  84. else{
  85. int dx[]={1, -1, 0, 0};
  86. int dy[]={0, 0, 1, -1};
  87. for(int i=0;i<4;i++){
  88. ll x1=x+dx[i], y1=y+dy[i];
  89. if(x1>=1 and x1<=n and y1>=1 and y1<=m and board[x1][y1] and 1+visited[x][y]<visited1[x1][y1] and 1+visited[x][y]<=visited[x1][y1]){
  90. visited[x1][y1]=1+visited[x][y];
  91. q.push({x1, y1});
  92. //1 for going right
  93. //2 for left
  94. //3 for up
  95. //4 fur down
  96. if(dx[i]==1 and dy[i]==0){
  97. //go down
  98. parent[x1][y1]=4;
  99. }
  100. if(dx[i]==0 and dy[i]==1){
  101. //right
  102. parent[x1][y1]=1;
  103. }
  104. if(dx[i]==-1 and dy[i]==0){
  105. //up
  106. parent[x1][y1]=3;
  107. }
  108. else if(dx[i]==0 and dy[i]==-1){
  109. parent[x1][y1]=2;
  110. }
  111. }
  112. }
  113. }
  114. }
  115. cout<<"NO"<<'\n';
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement