当前位置: 首页 > 知识库问答 >
问题:

绘制白板作为输入的有效算法是什么

姜景辉
2023-03-14

有一个M x N(M, N

我试图解决它,但找不到可能的解决办法。现在,我想知道解决这个问题的有效算法。

exam1)
给定一个5x3矩阵作为问题输入,
'o'-

o o o
x o x
o o o
x o x
o o

回答)油漆的最小数量为5<绘制(0,0…0,2)
绘制(2,0…2,2)
绘制(4,0…4,2)
绘制(1,1)
绘制(3,1)


给定一个3x3矩阵,

o x o
o o
o x o

回答)油漆的最小数量为3<绘制(0,0…2,0)
绘制(1,1)
绘制(0,2…2,2)

exam3)
给定一个3x3矩阵,

o o o
o o o
o x o

答案)油漆的最小计数是3。
油漆(0,0 ... 2,0)
油漆(0,1 ... 1,1)
油漆(0,2 ... 2,2)

exam4)
给定一个3x3矩阵,

o x o
x o
o x o

回答)油漆的最小数量为4<绘制(0,2…2,2)
绘制(0,0)
绘制(1,1)
绘制(2,0)

共有1个答案

宰父浩漫
2023-03-14

这样做的一种方法是遍历可能性,计算每次预形成一个动作的次数,并计算计数s的最小值

f(grid,count)
    for each square in grid
        if square is a circle // i.e. 'o'
            return min(g(grid with vertical stroke,count+1),
                       g(grid with horizontal stroke,count+1))
    return count

我代表

o o o
x o x
o o o
x o x
o o o

boolean arr [][] = {
            {false,false,false},
            {true,false,true},
            {false,false,false},
            {true,false,true},
            {false,false,false}
    };

在java中,我有:

// return copy of arr
static boolean[][] copy(boolean arr[][]){
    boolean[][] c = new boolean[arr.length][arr[0].length];
    for(int i = 0; i < arr.length; i++)
        c[i] = arr[i].clone();
    return c;
}

// select consecutive squares horizontal stroke at (i,j)
static boolean[][] leftRight(boolean arr[][],int i, int j){
    boolean[][] c = copy(arr);

    // right
    int k = j;
    while (true){
        if(k==arr[0].length || c[i][k]){
            break;
        }
        c[i][k] = true;
        k++;
    }

    // left
    k = j;
    while (true){
        if(k==-1 || c[i][k]){
            break;
        }
        c[i][k] = true;
        k--;
    }
    c[i][j] = true;
    return c;
}

// select consecutive squares vertical stroke at (i,j)
static boolean[][] upDown(boolean arr[][],int i, int j){
    boolean[][] c = copy(arr);

    // down
    int k = i;
    while (true){
        if(k==arr.length || c[k][j]){
            break;
        }
        c[k][j] = true;
        k++;
    }

    // up
    k = i;
    while (true){
        if(k==-1 || c[k][j]){
            break;
        }
        c[k][j] = true;
        k--;
    }
    c[i][j] = true;
    return c;
}


static int g(boolean arr[][], int count){
    // for each square in grid
    for (int i = 0; i < arr.length; i++) {
        for (int j = 0; j < arr[0].length; j++) {
            // if false then select square
            // and try horizontal and vertical stroke
            // take the min of the 2
            if (!arr[i][j]) {
                return Math.min(g(leftRight(arr,i,j),count+1),g(upDown(arr,i,j),count+1));
            }
        }
    }
    return  count;
}


public static void main(String args[]){
    /*
    o o o
    x o x
    o o o
    x o x
    o o o
    */
    boolean arr [][] = {
            {false,false,false},
            {true,false,true},
            {false,false,false},
            {true,false,true},
            {false,false,false}
    };
    System.out.println(g(arr,0));

}

输出:

5

 类似资料:
  • 我已经尝试了很多算法来渲染Mandelbrot集,包括简单的逃逸时间算法,以及优化的逃逸时间算法。但是,有没有更快的算法可以像我们在YouTube上看到的那样有效地产生真正深的缩放。此外,我很想得到一些想法,如何提高我的精度超过C/C

  • 我需要使用这个设置计算CRC-64到这个精彩的网站:http://www.sunshine2k.de/coding/javascript/crc/crc_js.html 正如您所看到的,我需要“Input Reflected”,这意味着我需要颠倒任何字节的位顺序(有点烦人)。目前,我使用一个查找表(例如0x55->0xAA)实现了这一点,但我想知道CRC是否有任何属性可以用来提高效率。 这是我的代

  • 我面临的问题与我的招摇文件: 这是我的问题: ✖Swagger Error非有效参数定义跳转到第20行详细信息目标代码:ONE_OF_MISSING参数:数组[0]消息:非有效参数定义路径:数组[5] 0:路径1:/货币/{当前ID} 2:获取3:参数4:0模式ID:http://swagger.io/v2/schema.json#内部:数组[2]级别:900类型:Swagger Error描述:

  • 我正面临一个奇怪的问题,几乎花了4个小时没有运气。 我有一个简单的Web API,我正在表单提交时调用它。 API- HTML- 当我点击提交按钮时,我得到以下错误- 启动类中的配置- 这只发生在POST请求中。GET request工作正常。在邮递员REST客户端中测试时也会出现同样的问题。有什么需要帮忙的吗?如果我能提供更多的细节,请让我知道。

  • 尽管这似乎很容易修复,但由于某种原因,我的.NET应用程序根本不将其视为有效的base64字符串。 我正在使用GMail API来获取消息,在我试图检索正文的最后一部分,我遇到了以下错误消息: 程序对它所获取的每条消息抛出异常,“第127行”位于“byte[]data”上。 我尝试在这个论坛中搜索类似的问题,但是,他们的解决方案似乎都不起作用,因为大多数人只是提供了将-and_符号更改为适合bas

  • 如果可以选择在单个JPanel中进行所有渲染,或者在多个JPanel中进行渲染(使用override paintComponent),并且不使用任何其他Swing组件,例如JButtons、JTextBox、JComboxes等(面板所在的JFrame除外)。如果只使用drawLine、drawRectangle、fillRect等进行绘图,那么在一个面板中绘制所有内容还是将绘图展开到多个面板上更