Advertisement
Sta99ot

Wow, Much Recursion, So Rain

Oct 10th, 2017
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var createMatrix = function(w,h,r) {
  2.         var matrix = new Array(h);
  3.         for(var i=0;i<h;i++){
  4.                 matrix[i] = new Array(w);
  5.                 for(var j=0;j<w;j++) {
  6.                         matrix[i][j] = r;
  7.                 }
  8.         }
  9.         return matrix;
  10. }
  11.  
  12. var print2dArray = function(array)
  13. {
  14.         for(var y = 0;y < array.length ; y++) {
  15.                 var line = "";
  16.                 for(var x=0;x<array[y].length;x++) {
  17.                         line = line + array[y][x];
  18.                 }
  19.                 console.log(line);
  20.         }
  21. }
  22.  
  23.  
  24. var get_water_volume = function(island)
  25. {
  26.     var sizeX = island[0].length;
  27.     var sizeY = island.length;
  28.  
  29.     var newIsland = Array(sizeY);
  30.     for(var i=0;i<sizeY ;i++){
  31.                 newIsland[i] = new Array(sizeX);
  32.                 for(var j=0;j<sizeX;j++) {
  33.                         newIsland [i][j] = island[i][j];
  34.                 }
  35.         }
  36.  
  37.  
  38.     var getHeight = function(x,y) {
  39.         if( x<0 || x >= sizeX || y<0 || y >= sizeY) {
  40.             return 0;
  41.         }
  42.         else {
  43.             return newIsland[y][x];
  44.         }
  45.     }
  46.  
  47.     var getOldHeight = function(x,y) {
  48.         if( x<0 || x >= sizeX || y<0 || y >= sizeY) {
  49.             return 0;
  50.         }
  51.         else {
  52.             return island[y][x];
  53.         }
  54.     }
  55.  
  56.  
  57.     var setHeight = function(x,y,value) {
  58.         if( x<0 || x >= sizeX || y<0 || y >= sizeY)
  59.                     return;
  60.         newIsland[y][x] = value;
  61.     }
  62.  
  63.     var raindrop = function(x,y,height,waterMatrix) {
  64.         if( x<0 || x >= sizeX || y<0 || y >= sizeY)
  65.                     return false;
  66.         var current = getHeight(x,y);
  67.         var waterApplyed = waterMatrix[y][x] > 0;
  68.         if(waterApplyed || current >= height)
  69.             return true;
  70.         waterMatrix[y][x] = 1;
  71.         var right = raindrop(x + 1,y,height,waterMatrix);
  72.         var left = raindrop(x - 1,y,height,waterMatrix);
  73.         var top = raindrop(x,y - 1,height,waterMatrix);
  74.         var bottom = raindrop(x,y + 1,height,waterMatrix);
  75.         return  right && left && top && bottom;
  76.     }
  77.  
  78.     var rain = function(x,y,height) {
  79.         var matrix = createMatrix(sizeX,sizeY,0);
  80.         if(raindrop(x,y,height,matrix)){
  81.             for(var _x=0;_x<sizeX;_x++)
  82.                     for(var _y=0;_y<sizeY;_y++)
  83.                 if(matrix[_y][_x] > 0)
  84.                                 setHeight(_x,_y,height);
  85.         }  
  86.    
  87.     }
  88.  
  89.     for(var x=1;x<sizeX-1;x++)
  90.     for(var y=1;y<sizeY-1;y++) {
  91.         var current = getHeight(x,y);
  92.         var left = getHeight(x-1,y);
  93.         var right = getHeight(x+1,y);
  94.         var top = getHeight(x,y-1);
  95.         var bottom = getHeight(x,y+1);
  96.         if(left>current)
  97.             rain(x,y,left);
  98.         if(right>current)
  99.                     rain(x,y,right);
  100.         if(top>current)
  101.                     rain(x,y,top);
  102.         if(bottom>current)
  103.                     rain(x,y,bottom);
  104.    
  105.     }
  106.     var volume = 0;
  107.     for(var x=0;x<sizeX;x++)
  108.     for(var y=0;y<sizeY;y++) {
  109.         volume += getHeight(x,y) - getOldHeight(x,y);
  110.     }
  111.     return(volume);
  112.  
  113. }
  114.  
  115. var island = [
  116. [5,3,4,5],
  117. [6,2,1,4],
  118. [3,1,1,4],
  119. [8,5,4,3]
  120. ];
  121.  
  122. console.log(get_water_volume(island)); //node js
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement