如何解决这个二维数组问题?

时间:2019-09-14 06:41:13

标签: algorithm data-structures

Problem (THE QUESTION)

绘画描边 亚历克斯想画一幅画。一次笔划,Alex只能绘制通过某些边缘连接的相同颜色的单元格。 给定绘画为表示颜色的字母的二维数组,请确定完全绘画的最小笔画数。

示例:画布的高度h = 3,宽度w = 5将使用picture = [“ aabba”,“ aabba”,“ aaacb”]进行绘制。下图显示了绘制画布所需的5个笔触。颜色a和b分别花了两笔,c则花了

a a b b a
a a b b a 
a a a c b

功能说明在下面的编辑器中完成功能strokesRequired。该函数必须返回一个整数,即绘制画布所需的最小笔划数。

strokesRequired具有以下参数:picture [picture [0],... picture [h-1]]字符串数组,其中每个字符串代表要绘制的图片的一行

约束

1 <= h <= 10 ^ 5

1 <= w <= 10 ^ 5

1 <= h * w <= 10 ^ 5

len(pictureffl)= w(其中0 <= i

picture [i] [j] <-(a,b,c)(其中0 <= i

你好..所以我参加了一次公司面试,他们问我这个问题,我没有任何想法请帮忙

2 个答案:

答案 0 :(得分:0)

class Paint: 

    def __init__(self, row, col, arr): 
        self.ROW = row 
        self.COL = col 
        self.arr = arr

    def visit(self, i, j, visited):
        ele = self.arr[i][j]
        for k in range(i,self.ROW):
            for l in range(j, self.COL):
               if self.arr[k][l]==ele:
                   visited[k][l]=True
                   v=l
                   if l>0 and self.arr[k][l-1]==ele and not visited[k][l-1]:
                       self.visit(k, l-1, visited)
                   if k>0 and self.arr[k-1][l]==ele and not visited[k-1][l]:
                       self.visit(k-1, l, visited)
               elif l>=v:
                   break
    # 2D matrix 
    def count_cells(self): 
        # Make an array to mark visited cells. 
        # Initially all cells are unvisited 
        visited = [[False for j in range(self.COL)]for i in range(self.ROW)] 

        # Initialize count as 0 and travese 
        count = 0
        for i in range(self.ROW): 
            for j in range(self.COL): 
                # If a cell value false then not visited yet 
                # then visit
                if visited[i][j] == False: 
                    # Visit all cells in the array
                    self.visit(i, j, visited)
                    print(visited)
                    count += 1

        return count 


arr = ["aabba", "aabba", "aaacb"]

row = len(arr) 
col = len(arr[0]) 

p = Paint(row, col, arr) 

print (p.count_cells())

答案 1 :(得分:0)

function visit(picture, i, j, visitedBoxes) {
    const currentElem = picture[i][j];
    if (picture[i][j] === currentElem) {
        visitedBoxes[i][j] = true;
        // go in four directions
        // south
        if (i + 1 < picture.length && picture[i+1][j] === currentElem && visitedBoxes[i+1][j] === false) {
            visit(picture, i+1, j, visitedBoxes);
        }
        // west
        if (j+ 1 < picture[i].length && picture[i][j+1] === currentElem && visitedBoxes[i][j+1] === false) {
            visit(picture, i, j+1, visitedBoxes);
        }
        // north
        if (i > 0 && picture[i-1][j] === currentElem && visitedBoxes[i-1][j] === false) {
            visit(picture, i-1, j, visitedBoxes);
        }
        // west
        if (j > 0 && picture[i, j-1] === currentElem && visitedBoxes[i, j-1] === false) {
            visit(picture, i, j-1, visitedBoxes);
        }
    }
}

function countStrokes(picture) {
    const visitedBoxes = [];
    for (let i = 0; i < picture.length; i++) {
        visitedBoxes[i] = [];
        for(let j = 0; j < picture[i].length; j++) {
            visitedBoxes[i][j] = false;
        }
    }
    let srokesCount = 0;
    for (let i = 0; i < picture.length; i++) {
        for (let j = 0; j < picture[i].length; j++) {
            if (!visitedBoxes[i][j]) {
                visit(picture, i, j, visitedBoxes);
                srokesCount++;
            }
        }
    }
    console.log('Strokes Count', srokesCount);
}

countStrokes(['aaaba', 'ababa', 'aacba']);

这将输出5。

还可以使用

function printVisited(visitedBoxes) {
    for (let i = 0; i < visitedBoxes.length; i++) {
        let str = ''
        for(let j = 0; j < visitedBoxes[i].length; j++) {
            str += visitedBoxes[i][j] ? '1 ': '0 ';
        }
        console.log(str);
    }
    console.log('-------------');
}

在每次循环后打印。

输出

1 1 1 0 0 
1 0 1 0 0 
1 1 0 0 0 
-------------
1 1 1 1 0 
1 0 1 1 0 
1 1 0 1 0 
-------------
1 1 1 1 1 
1 0 1 1 1 
1 1 0 1 1 
-------------
1 1 1 1 1 
1 1 1 1 1 
1 1 0 1 1 
-------------
1 1 1 1 1 
1 1 1 1 1 
1 1 1 1 1 
-------------
Strokes Count 5