C语言模式解码器

ou6hu8tu  于 2023-06-21  发布在  其他
关注(0)|答案(1)|浏览(116)

我试图开发一个模式解码器使用C语言程序。该模式将像例如:

5 8
1
2
4 
3 
1
1 3 2 1 0 1 2 1

第一行指示行数和列数。接下来的几行列出了每行中绘制的正方形的计数,最后一行是每列绘制的正方形的空格分隔计数。
这是一个5x 8的板与油漆和未油漆的点或正方形。该模式可以在.txt文件中表示。在所附图像上可以看到相同的表示。预期输出如下,其中由'-'表示的是未绘制的点或正方形,并且由'#'表示的是绘制的点或正方形。
预期模式

-#------
-##-----
####----
-----###
------#-

程序输出

#-------
##------
####----
###---#-
####-###

我试着写一些代码,但它不能正确显示或打印,我试过调试,但没有成功。

#include <stdio.h>

#define ROWS 5
#define COLS 8

int main() {
    int row_counts[] = {1, 2, 4, 3, 1};
    int col_counts[] = {1, 3, 2, 1, 0, 1, 2, 1};

    char board[ROWS][COLS];
    int i, j;

    // Initialize the board with unpainted dots
    for (i = 0; i < ROWS; i++) {
        for (j = 0; j < COLS; j++) {
            board[i][j] = '-';
        }
    }

    // Paint the dots based on row and column counts
    for (i = 0; i < ROWS; i++) {
        for (j = 0; j < row_counts[i]; j++) {
            board[i][j] = '#';
        }
    }
    
    for (j = 0; j < COLS; j++) {
        for (i = ROWS - 1; i >= ROWS - col_counts[j]; i--) {
            board[i][j] = '#';
        }
    }

    // Print the decoded pattern
    for (i = 0; i < ROWS; i++) {
        for (j = 0; j < COLS; j++) {
            printf("%c", board[i][j]);
        }
        printf("\n");
    }

    return 0;
}
jogvjijk

jogvjijk1#

您可以通过如下方式构建流网络,将此问题转换为max-flow problem
1.存在单个源折点
1.每行有一个顶点,从源到每行有一条边,其容量等于行计数。
1.每列有一个顶点,每行到每列有一条边,容量为1。这些边对应于矩阵中的单元格。
1.有一个汇点和一条从每个列顶点到汇点的边,容量等于列数。
现在,您可以找到从源到汇的最大流量,例如使用Edmonds-Karp algorithm。然后,在矩阵中,如果在流中使用了行->列边缘,则绘制每个正方形。如果您的流没有满足所有的行和列限制,那么就没有解决方案。

相关问题