Guest User

Untitled

a guest
Jul 16th, 2019
233
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.43 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. struct record{
  3.     int f=0,h=0,g=0,x,y,px,py;
  4.     int order=0;//g:current h:heuristic
  5. };
  6. struct cmp{
  7.     bool operator()(record a,record b){
  8.         if(a.f==b.f)return a.order<b.order;
  9.         return a.f>b.f;
  10.     }
  11. };
  12. int n,gx,gy,order;//gx:goal x / gy:goal y
  13. char maze[1000][1000];
  14. bool closelist[1000][1000];
  15. record mazedata[1000][1000];
  16. std::priority_queue<record,std::vector<record>,cmp>openlist;
  17. void reset(){
  18.     order=0;
  19.     for(int i=0;i<1000;i++){
  20.         for(int j=0;j<1000;j++){
  21.             closelist[i][j]=false;
  22.             mazedata[i][j].f=0;mazedata[i][j].x=i;mazedata[i][j].y=j;
  23.         }
  24.     }
  25.     while(!openlist.empty())openlist.pop();
  26. }
  27. void astar_algorithm(int x,int y){
  28.     int g,dx[4]={-1,0,0,1},dy[4]={0,-1,1,0};
  29.     while(!openlist.empty()){
  30.         g=mazedata[x][y].g;
  31.         if(x==gx&&y==gy){
  32.             closelist[x][y]=true;
  33.             break;
  34.         }
  35.         for(int i=0;i<4;i++){
  36.             if(x+dx[i]<n&&x+dx[i]>=0&&y+dy[i]<n&&y+dy[i]>=0&&closelist[x+dx[i]][y+dy[i]]==false&&maze[x+dx[i]][y+dy[i]]=='.'){
  37.                 if(mazedata[x+dx[i]][y+dy[i]].f!=0){
  38.                     if(g+1+mazedata[x+dx[i]][y+dy[i]].h<mazedata[x+dx[i]][y+dy[i]].f){
  39.                         mazedata[x+dx[i]][y+dy[i]].px=x;
  40.                         mazedata[x+dx[i]][y+dy[i]].py=y;
  41.                         mazedata[x+dx[i]][y+dy[i]].f=g+1+mazedata[x+dx[i]][y+dy[i]].h; 
  42.                         mazedata[x+dx[i]][y+dy[i]].g=g+1;
  43.                         mazedata[x+dx[i]][y+dy[i]].order=++order;
  44.                         openlist.push(mazedata[x+dx[i]][y+dy[i]]);                 
  45.                     }
  46.                 }else{
  47.                     mazedata[x+dx[i]][y+dy[i]].h=abs(x+dx[i]-gx)+abs(y+dy[i]-gy);
  48.                     mazedata[x+dx[i]][y+dy[i]].g=g+1;
  49.                     mazedata[x+dx[i]][y+dy[i]].f=mazedata[x+dx[i]][y+dy[i]].h+mazedata[x+dx[i]][y+dy[i]].g;
  50.                     mazedata[x+dx[i]][y+dy[i]].px=x;
  51.                     mazedata[x+dx[i]][y+dy[i]].py=y;
  52.                     mazedata[x+dx[i]][y+dy[i]].order=++order;
  53.                     openlist.push(mazedata[x+dx[i]][y+dy[i]]); 
  54.                 }
  55.  
  56.             }
  57.         }
  58.         closelist[x][y]=true;
  59.         openlist.pop();
  60.         x=openlist.top().x;
  61.         y=openlist.top().y;
  62.        
  63.  
  64.     }
  65. }
  66. int main(){
  67.     std::ios::sync_with_stdio(false);
  68.     int m,a,b,x,y;
  69.     int tx,ty;
  70.     std::cin>>n>>m;
  71.     for(int i=0;i<n;i++){
  72.         for(int k=0;k<n;k++){
  73.             std::cin>>maze[i][k];
  74.         }
  75.     }
  76.     while(m--){
  77.         reset();
  78.         std::cin>>a>>b>>x>>y;
  79.         if(maze[a][b]=='X'||maze[x][y]=='X'){
  80.             std::cout<<"ERROR\n";
  81.             continue;
  82.         }else{
  83.             gx=x;
  84.             gy=y;
  85.             mazedata[a][b].g=0;
  86.             mazedata[a][b].order=0;
  87.             openlist.push(mazedata[a][b]);
  88.             astar_algorithm(a,b);
  89.             if(closelist[x][y]==false)std::cout<<"-1\n";
  90.             else {
  91.                 std::cout<<mazedata[x][y].g<<std::endl;
  92.             }
  93.         }
  94.     }
  95. }
Advertisement
Add Comment
Please, Sign In to add comment