我有一个难题要解决,其中包括输入网格大小的输入。网格总是方形的。然后提供网格上的多个点,并且如果它们立即向左或向右或在上方或下方,则网格上的方格被“采用”。
例如想象一个网格10 x 10.如果点是左下角(1,1)和右上角(10,10),那么如果给出一个点(2,1)则左右方形位置(10个方格) )以及上下(另外9个方格)。因此,使用简单的算法,如果网格是n平方,则在提供的第一个点上将采用n +(n-1)个方格。
但如果提供其他点作为输入,则会变得复杂。例如,如果下一个点是例如(5,5),那么另外19个正方形将被“采取”减去与其他点重叠的正方形。所以它变得复杂。当然有一点可以说(3,1)可以重叠更多。
是否有针对此类问题的算法?
或者仅仅是持有二维数组并为每个正方形放置一个x。然后在最后只是总结采取(或非采取)正方形。这可行,但我想知道是否有更简单的方法。
答案 0 :(得分:1)
保留两组:X(存储所有x-coords)和Y(存储所有y-coords)。采用的平方数为n *(| X | + | Y |) - | X | * | Y |。这是因为每个唯一的x-coord移除一列n个正方形,并且每个唯一的y-coord移除一行n个正方形。但这会将删除的行和列的交叉点计算两次,因此我们减去| X | * | Y |解释这一点。
答案 1 :(得分:0)
一种方法是跟踪某些数据结构中的位置,例如一组。
我们实际上可以看到第一步只是其他轮次的一个特例,因为在第一轮中还没有得分。所以一般来说,算法是跟踪所采取的点并将任何新的点添加到数据结构中。
所以在伪代码中:
每当你处理一个点(x,y)时:
给定一个点(x,y):
对于与(x,y)相交的水平和垂直线上的每个点(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