(Javascript - 数组)获得最左和最正确的连接角色

时间:2017-11-13 18:44:59

标签: javascript arrays algorithm

我有一个数组(2d矩阵),我想得到

的x / y值
  • 最左边&顶部连接' 1' -character
  • 最正确的&底部连接' 1' -character
  

编辑2.0:

我用参数x / y调用我的函数,这是我的开始坐标 - ' 1' -character。

10001
00001
11111
01110   --> (x: 1, y: 3)

我的功能检查上面的列&如果有一个字符' 1'它计算x或y(找到列的位置)加1。

我的函数从特定点开始(例如y:2,x:0)

var array = [
 '00000',
 '01111',       --> get position of the most top & right '1'-character (x: 4, y: 1)
 '11000',
 '00000'
]

这是获取' 1' -characters的右上角的功能:



var array = [
 '00000',
 '01111',      
 '11000',
 '00000'
]
  
  
  Array.prototype.get_top_right = function(x_pos, y_pos) {
    var matrix = this, y1= y_pos;
    for (var x1 = x_pos; x1 < this[0].length; x1++) {
      try {
        if (matrix[(y1-1)][x1] == '1') y1--;
        else if (matrix[y1][(x1+1)] != '1') break;
      } catch(e) {}
    }; return [x1,y1]
 }
 
 var result=array.get_top_right(0,2)
 
 console.log(result)
&#13;
&#13;
&#13;

确定。上面的函数似乎工作正常,但现在我想转过程来获得我的数组/ 2D矩阵的最后一个左下角连接的#1;#/ p。

var array = [
  '00000',
  '01111',      
  '11000', --> get position of the most bottom & left '1'-character (x: 0, y: 2)
  '00000'
]

我不知道如何修改上面的功能以获得左下角匹配,而不是像上面所见的最右边和最高匹配。

  

编辑1.0我的功能我已编码,直到尚未正常工作,但看起来像这样:

Array.prototype.get_bottom_left = function(x_pos, y_pos) {
    var matrix = this, y2= y_pos;
    for (var x2 = x_pos; x2 > 0; x2--) {
      try {
        if (matrix[(y2+1)][x2] == '1') y2++;
        if (matrix[y2][(x2-1)] != '1') break;
      } catch(e) {}
    }; return [x2,y2]
 }
  

使用上面的这个函数和下面的error_array来获取数组的左下角连接字符将导致浏览器崩溃。尼斯!

  var error_array = [
    '000000',
    '000011',
    '111110',
    '111111'
  ] 

但是,我希望有人可以帮助我更新我的功能......

提前感谢一百万, 问候 - 汉斯。

2 个答案:

答案 0 :(得分:0)

我创建了两个版本的get_bottom_left方法:

  • bottom_left_up遍历(x,y)指向左侧和向上
  • bottom_left_down遍历(x,y)指向右侧和下方。

以下是实施:

Array.prototype.bottom_left_up = function(x, y) {
  if(this[y][x] === '0') {
    return;
  }
  while(y >= 0) {
    while(--x >= 0) {
      if(this[y][x] === '0') {
        return [x + 1, y];
      }
    }
    if(--y === -1 || this[y][this[y].length - 1] === '0') {
      return [0, y + 1];
    }
    x = this[y].length;
  }
};

Array.prototype.bottom_left_down = function(x, y) {
  if(this[y][x] === '0') {
    return;
  }
  while(y < this.length) {
    if(this[y].indexOf('0', x) !== -1) {
      return [x, y];
    }
    if(++y === this.length || this[y][0] === '0') {
      return [x, y - 1];
    }
    x = 0;
  }
};

你看,没有超出范围的保护,它可以单独添加没有问题。让我们测试逻辑:

var array = [
 '00000',
 '01111',
 '11000',
 '00000'
];
console.log(array.bottom_left_up(2, 1)); // [1, 1]
console.log(array.bottom_left_down(2, 1)); // [0, 2]

var array2 = [
  '000000',
  '000011',
  '111110',
  '111111'
];
console.log(array2.bottom_left_up(3, 3)); // [0, 3]
console.log(array2.bottom_left_down(3, 3)); // [3, 3]

关于方法保护,我不会使用try-catch,我会建议像:

function(x, y) {
  x = parseInt(x, 10);
  y = parseInt(y, 10);
  if(!this.length || isNaN(x) || isNaN(y) || x < 0 || y < 0 || x >= this.length || y >= this[0].length) {
    return;
  }
  // ...
}

所以你会在3种情况下得到'未定义':空数组,坏参数,未找到。

答案 1 :(得分:-1)

这是一个似乎可以用任何大小的矩阵来完成这个功能的函数,但是我不太确定你是否总想找到第一个&#34; 1&#34;在矩阵中即使它单独在线上和右侧.. 使用数组作为测试参数

    var array = [
    '00000',
    '01111',       
    '11000',
    '00100'];

var error_array = [
    '000000',
    '000011',
    '111111',
    '111111',
    '000000',
    '000010',
    '100000'
    ] 


getLeftBottom(error_array);

function getLeftBottom(testArray)
{
    var firstFound;
    for (var index = testArray.length; index > 0; index--)
    {
        console.log(testArray[index-1]);
        str = testArray[index-1];
        firstFound = str.indexOf("1");
        if (firstFound !== -1)
        {
            console.log("Coordinates: x = {0}, y = {1}", firstFound, index)   // Apparently this doesn't work as I expected in JS but you can still see the coordinates
            break;
        }

    }
}