Advertisement
DontCallMeNuttoPleas

IcyFloor

Mar 31st, 2020
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.06 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. using pii=pair<int,int>;
  4. using pipii=pair<int,pii>;
  5. int dis[1010][1010];
  6. bool visited[1010][1010];
  7. pii walk[4]={{0,1},{1,0},{0,-1},{-1,0}};//R,D,L,U;
  8. int main(){
  9.     int n;
  10.     scanf("%d",&n);
  11.     bool a[n][n];
  12.     for(int i=0;i<n;i++){
  13.         for(int j=0;j<n;j++){
  14.             scanf("%d",&a[i][j]);
  15.             dis[i][j]=2e9;
  16.         }
  17.     }
  18.     dis[0][0]=0;
  19.     priority_queue<pipii,vector<pipii>,greater<pipii>> Q;
  20.     Q.push({0,{0,0}});
  21.     while(!Q.empty()){
  22.         int d=Q.top().first;
  23.         int x=Q.top().second.first;
  24.         int y=Q.top().second.second;
  25.         Q.pop();
  26.         if(x==n-1&&y==n-1){
  27.             printf("%d",d);
  28.             return 0;
  29.         }
  30.         if(visited[x][y]) continue;
  31.         visited[x][y]=true;
  32.         for(int i=0;i<4;i++){
  33.             int nd=d;
  34.             int nx=x;
  35.             int ny=y;
  36.             while(true){
  37.                 nx+=walk[i].first;
  38.                 ny+=walk[i].second;
  39.                 nd++;
  40.                 if(nx<0||ny<0||nx==n||ny==n||a[nx][ny]==1){
  41.                     ny-=walk[i].second;
  42.                     nx-=walk[i].first;
  43.                     nd-=1;
  44.                     if(nd<dis[nx][ny]&&!visited[nx][ny]){
  45.                         dis[nx][ny]=nd;
  46.                         Q.push({nd,{nx,ny}});
  47.                     }
  48.                     break; 
  49.                 }
  50.             }
  51.         }
  52.     }
  53. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement