我知道这可能只是解决你的作业,但我不得不这样做。
这是用 JavaScript 解决问题的一种有效方法,我相信它只是 O(n^2) (我对 O 表示法有点生疏,忽略可能在数据输入时完成的第一个循环)
它的工作原理如下
获取每个元素的位置
for (var a=0,aa=arr.length; a<aa; a++) // this loop may be able to be done when data is read in
{
result[a] = [];
for (var b=0,bb=arr[a].length; b<bb; b++)
{
result[a][b] = -1;
if(arr[a][b]==1)pos.push({x:a,y:b,dist:0});
}
}
开始循环数组
抓住第一个条目并将其删除。在 C++ 中,您应该使用队列
while(pos.length>0)
{
var p = pos[0];
pos.splice(0,1);
检查距离是否尚未设置
if(result[p.x][p.y]==-1)
{
检查 x 和 y 坐标是否在数组的范围内
将它们添加到位置数组/队列的末尾,以及一个额外的距离单位
var x = p.x+dx[a];
var y = p.y+dy[a];
if(x>=0&&x<result.length&&y>=0&&y<result[p.x].length)pos.push({x:x,y:y,dist:p.dist+1});
显示输出
for (var a=0,aa=arr.length; a<aa; a++)
{
console.log(result[a]);
}
完整代码:
<script>
var arr = [
[0,0,0,0],
[0,0,0,1],
[1,0,0,0],
[1,0,0,0]];
var result = [];
var pos = [];
for (var a=0,aa=arr.length; a<aa; a++) // this loop may be able to be done when data is read in
{
result[a] = [];
for (var b=0,bb=arr[a].length; b<bb; b++)
{
result[a][b] = -1;
if(arr[a][b]==1)pos.push({x:a,y:b,dist:0});
}
}
var dx = [-1,0,0,1];
var dy = [0,1,-1,0];
while(pos.length>0)
{
var p = pos[0];
pos.splice(0,1);
if(result[p.x][p.y]==-1)
{
result[p.x][p.y] = p.dist;
for(var a=0; a<4; a++)
{
var x = p.x+dx[a];
var y = p.y+dy[a];
if(x>=0&&x<result.length&&y>=0&&y<result[p.x].length)pos.push({x:x,y:y,dist:p.dist+1});
}
}
}
for (var a=0,aa=arr.length; a<aa; a++)
{
console.log(result[a]);
}
</script>