网格着色游戏:查找绘制的红色和蓝色线条的数量

时间:2015-10-17 06:21:36

标签: java algorithm dynamic-programming

问题描述:Walter的网格大小为N * M,最初每个单元格都是白色的。 Walter可以绘制水平或垂直笔划,其长度可以是1个或更多个单元格。 Walter仅使用RED颜色绘制水平笔划,使用BLUE颜色绘制垂直笔划Walter从不绘制两个水平或两个垂直笔划重叠。如果水平笔划穿过垂直笔划,则单元格的颜色为绿色。如果字符串具有单元格的颜色模式,请找到实现它所需的红色和蓝色笔划的数量。

输入:{“GRG”,“BGW”,“WWW”} OP:2红色和3蓝色笔画

2 个答案:

答案 0 :(得分:3)

import java.util.*;

public class GridColouring {

    public static int getStrokes(String [] grid) {
        int N = grid.length;
        int M = grid[0].length();
        HashSet<Integer> hr = new HashSet<>();
        HashSet<Integer> v = new HashSet<>();
        int count = 0;
        for (int i = 0; i < N; i++) {
            String row = grid[i];
            row = row.toUpperCase();
            for (int j = 0; j < M; j++) {
                // Precedence of 'and' greater than 'or'
                if (row.charAt(j) == 'G' || (row.charAt(j) == 'R' && !hr.contains(i))) {
                    hr.add(i);

                } else if (hr.contains(i)) {
                    if (j > 0 && grid[i].charAt(j - 1) == 'B') {
                        count++;
                    }
                }
                if (row.charAt(j) == 'G' || (row.charAt(j) == 'B' && !v.contains(j))) {
                    v.add(j);
                } else if(v.contains(j)) {

                    if (i > 0 && grid[i-1].charAt(j) == 'R') {
                        count++;
                    }
                }
            }
        }
        int horStrokes = hr.size();
        int verStrokes = v.size();

        int minStrokes = horStrokes + verStrokes + count;
        return minStrokes;
    }
    public static void main(String [] args) {

        String [] a = {"GR.","BG.","RBR","BBB"};
        System.out.println(getStrokes(a));
    }
}

输出:8

答案 1 :(得分:0)

我不知道动态编程会为此添加什么。

使每个连续的红色或绿色像素线成为水平笔划。

使每个连续的蓝色或绿色像素列成为垂直笔划。

计算笔画总数。这将再现初始模式,并且是所需的最小笔画数:每个笔画尽可能地延伸,而不会与数据相矛盾。