网格上的位置'使用'

时间:2013-12-27 19:28:20

标签: algorithm

我有一个难题要解决,其中包括输入网格大小的输入。网格总是方形的。然后提供网格上的多个点,并且如果它们立即向左或向右或在上方或下方,则网格上的方格被“采用”。

例如想象一个网格10 x 10.如果点是左下角(1,1)和右上角(10,10),那么如果给出一个点(2,1)则左右方形位置(10个方格) )以及上下(另外9个方格)。因此,使用简单的算法,如果网格是n平方,则在提供的第一个点上将采用n +(n-1)个方格。

但如果提供其他点作为输入,则会变得复杂。例如,如果下一个点是例如(5,5),那么另外19个正方形将被“采取”减去与其他点重叠的正方形。所以它变得复杂。当然有一点可以说(3,1)可以重叠更多。

是否有针对此类问题的算法?

或者仅仅是持有二维数组并为每个正方形放置一个x。然后在最后只是总结采取(或非采取)正方形。这可行,但我想知道是否有更简单的方法。

3 个答案:

答案 0 :(得分:1)

保留两组:X(存储所有x-coords)和Y(存储所有y-coords)。采用的平方数为n *(| X | + | Y |) - | X | * | Y |。这是因为每个唯一的x-coord移除一列n个正方形,并且每个唯一的y-coord移除一行n个正方形。但这会将删除的行和列的交叉点计算两次,因此我们减去| X | * | Y |解释这一点。

答案 1 :(得分:0)

一种方法是跟踪某些数据结构中的位置,例如一组。

  • 在第一步,这涉及向该数据结构添加n +(n - 1)个方块。
  • 在第二步(第三步,第四步)等,这涉及检查给定(x,y)的水平和垂直线上的每个方格是否已经在数据结构中。如果没有,则将其添加到数据结构中。否则,如果该点已经在那里,那么它是在较早的步骤中进行的。

我们实际上可以看到第一步只是其他轮次的一个特例,因为在第一轮中还没有得分。所以一般来说,算法是跟踪所采取的点并将任何新的点添加到数据结构中。

所以在伪代码中:

  • 创建数据结构taken_points =空数据结构(例如,一组)

每当你处理一个点(x,y)时:

  • 设置一个计数器= 0.
  • 给定一个点(x,y):

    • 对于与(x,y)相交的水平和垂直线上的每个点(px,py):

    • 检查该点是否已经在taken_points

      • 如果是,则不做任何事
      • 否则,将(px,py)添加到taken_points并递增计数器

您现在已更新taken_points以包含到目前为止所采取的所有点,而counter是在最近一轮中所采取的点数。

答案 2 :(得分:0)

以下是不使用大空间的方法: -

rowVisited[n] = {0} 
colVisited[n] = {0}

totalrows = 0 and totalcol = 0  for total rows and columns visited

total = 0;  // for point taken for x,y


given point (x,y)  

   if(!rowVisited[x]) {

        total = total + n - totalcol;
   }

   if(!colVisited[y]) {

         total = total + n-1 - totalrows + rowVisited[x];

   }

   if(!rowVisited[x]) {

        rowVisited[x]  = 1;
        totalrows++;
   }

   if(!colVisited[x]) {

       colVisited[x] = 1;
       totalcol++;
   }


print total