SuitNdtie

Icy Floor

Apr 10th, 2019
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.45 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<queue>
  3. using namespace std;
  4.  
  5. struct vertices{
  6.     int I,J,dis;
  7.     bool operator < (const vertices& rhs)const{
  8.         return dis > rhs.dis;
  9.     }  
  10. };
  11. bool isinbound(int I,int N){
  12.     return (I >= 1 && I <= N);
  13. }
  14. int main()
  15. {
  16.     int n;
  17. //  printf("Test\n");
  18.     scanf("%d",&n);
  19.     bool map[n+2][n+2];for(int i=0;i<n+2;i++)for(int j=0;j<n+2;j++)map[i][j] = true;
  20.     bool visited[n+2][n+2];for(int i=0;i<n+2;i++)for(int j=0;j<n+2;j++)visited[i][j] = false;
  21.     int dist[n+2][n+2];for(int i=0;i<n+2;i++)for(int j=0;j<n+2;j++)dist[i][j] = 2e9;
  22.     dist[1][1] = 0;
  23.     for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)scanf("%d",&map[i][j]);
  24.  
  25.     priority_queue<vertices> pq;
  26.     pq.push({1,1,0});
  27.    
  28.     int moveI[4] = {-1,0,1,0};
  29.     int moveJ[4] = {0,1,0,-1};
  30.     while(!pq.empty()){
  31.         int uI = pq.top().I;
  32.         int uJ = pq.top().J;
  33.         int uD = pq.top().dis;
  34.     //  printf("Test (%d,%d) : %d\n",uI,uJ,uD);
  35.         pq.pop();
  36.         if(visited[uI][uJ])continue;
  37.         visited[uI][uJ] = true;
  38.        
  39.         for(int i=0;i<4;i++){
  40.             int cnt = 0;
  41.             int nI = uI;
  42.             int nJ = uJ;
  43.             while(!map[nI + moveI[i]][nJ + moveJ[i]] && isinbound(nI + moveI[i],n) && isinbound(nJ + moveJ[i],n) ){
  44.                 nI += moveI[i];
  45.                 nJ += moveJ[i];
  46.                 cnt++;
  47.             }
  48.             if(!visited[nI][nJ] && !(nI == uI && nJ == uJ) && dist[uI][uJ] + cnt < dist[nI][nJ] && nI >= 1 && nI <= n && nJ >= 1 && nJ <= n){
  49.                 dist[nI][nJ] = dist[uI][uJ] + cnt;
  50.                 pq.push({nI,nJ,dist[nI][nJ]});
  51.             }
  52.         }
  53.     }
  54.     printf("%d",dist[n][n]);
  55.     return 0;
  56. }
Advertisement
Add Comment
Please, Sign In to add comment