Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var createMatrix = function(w,h,r) {
- var matrix = new Array(h);
- for(var i=0;i<h;i++){
- matrix[i] = new Array(w);
- for(var j=0;j<w;j++) {
- matrix[i][j] = r;
- }
- }
- return matrix;
- }
- var print2dArray = function(array)
- {
- for(var y = 0;y < array.length ; y++) {
- var line = "";
- for(var x=0;x<array[y].length;x++) {
- line = line + array[y][x];
- }
- console.log(line);
- }
- }
- var get_water_volume = function(island)
- {
- var sizeX = island[0].length;
- var sizeY = island.length;
- var newIsland = Array(sizeY);
- for(var i=0;i<sizeY ;i++){
- newIsland[i] = new Array(sizeX);
- for(var j=0;j<sizeX;j++) {
- newIsland [i][j] = island[i][j];
- }
- }
- var getHeight = function(x,y) {
- if( x<0 || x >= sizeX || y<0 || y >= sizeY) {
- return 0;
- }
- else {
- return newIsland[y][x];
- }
- }
- var getOldHeight = function(x,y) {
- if( x<0 || x >= sizeX || y<0 || y >= sizeY) {
- return 0;
- }
- else {
- return island[y][x];
- }
- }
- var setHeight = function(x,y,value) {
- if( x<0 || x >= sizeX || y<0 || y >= sizeY)
- return;
- newIsland[y][x] = value;
- }
- var raindrop = function(x,y,height,waterMatrix) {
- if( x<0 || x >= sizeX || y<0 || y >= sizeY)
- return false;
- var current = getHeight(x,y);
- var waterApplyed = waterMatrix[y][x] > 0;
- if(waterApplyed || current >= height)
- return true;
- waterMatrix[y][x] = 1;
- var right = raindrop(x + 1,y,height,waterMatrix);
- var left = raindrop(x - 1,y,height,waterMatrix);
- var top = raindrop(x,y - 1,height,waterMatrix);
- var bottom = raindrop(x,y + 1,height,waterMatrix);
- return right && left && top && bottom;
- }
- var rain = function(x,y,height) {
- var matrix = createMatrix(sizeX,sizeY,0);
- if(raindrop(x,y,height,matrix)){
- for(var _x=0;_x<sizeX;_x++)
- for(var _y=0;_y<sizeY;_y++)
- if(matrix[_y][_x] > 0)
- setHeight(_x,_y,height);
- }
- }
- for(var x=1;x<sizeX-1;x++)
- for(var y=1;y<sizeY-1;y++) {
- var current = getHeight(x,y);
- var left = getHeight(x-1,y);
- var right = getHeight(x+1,y);
- var top = getHeight(x,y-1);
- var bottom = getHeight(x,y+1);
- if(left>current)
- rain(x,y,left);
- if(right>current)
- rain(x,y,right);
- if(top>current)
- rain(x,y,top);
- if(bottom>current)
- rain(x,y,bottom);
- }
- var volume = 0;
- for(var x=0;x<sizeX;x++)
- for(var y=0;y<sizeY;y++) {
- volume += getHeight(x,y) - getOldHeight(x,y);
- }
- return(volume);
- }
- var island = [
- [5,3,4,5],
- [6,2,1,4],
- [3,1,1,4],
- [8,5,4,3]
- ];
- console.log(get_water_volume(island)); //node js
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement