我试图开发一个模式解码器使用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;
}
1条答案
按热度按时间jogvjijk1#
您可以通过如下方式构建流网络,将此问题转换为max-flow problem:
1.存在单个源折点
1.每行有一个顶点,从源到每行有一条边,其容量等于行计数。
1.每列有一个顶点,每行到每列有一条边,容量为1。这些边对应于矩阵中的单元格。
1.有一个汇点和一条从每个列顶点到汇点的边,容量等于列数。
现在,您可以找到从源到汇的最大流量,例如使用Edmonds-Karp algorithm。然后,在矩阵中,如果在流中使用了行->列边缘,则绘制每个正方形。如果您的流没有满足所有的行和列限制,那么就没有解决方案。