如何在C中分离2d数组中的行

时间:2018-03-20 10:04:54

标签: c algorithm multidimensional-array

我想做的是,

例如,假设宽度和高度分别为6和4,而2d数组的输入为:

0 1 2 2 1 0
1 0 0 0 0 1
1 0 0 0 0 1
0 1 1 1 1 0

第2行以1结束,第3行以1结束,因此数字在" count"变量增加了它的值,因为它关注" 1s"作为重复的数字。

更具体地说,

这些输入的总输出应为:

1 2 1(第1行)

1 1(第2行)

1 1(第3行)

4(第4行)

第一行有一个1和两个连续的2和一个1,因此它变为1 2 1。

第二行有两个1但它们没有相互链接,因此它变为1。

最后一行有四个连续的1,所以它变成了4。

int main(void) {

int width = 0;
int height = 0;
int input = 0;
int i, j = 0;
int val = 1;

scanf("%d %d", &width, &height);
int board[height][width];

for(i = 0; i < height; i++)
{
    for(j = 0; j < width; j++)
    {
        scanf("%d", &input);
        board[i][j] = input;
    }
}

for(i = 0; i < height; i ++)
{
    val = 1;

    for(j = 0; j < width; j++)
    {

        if(board[i][j]>0)
        {   

            if(board[i][j] == board[i][j+1])
            {

                val++;
                printf("%d ", val); 

            } 

            if(board[i][j+1] == 0)
            {
                val = 1;
            }

            if(board[i][j] != board[i][j+1] && board[i][j] != board[i][j-1])
            {

                val = 1;
                printf("%d ", val);

            }
        }   
    }   

    printf("\n");
}

return 0;
}

这是我到目前为止所做的,但有两个问题...... 使用上面的输入,此代码输出:

1 2 1

1 2

1

2 3 4

第二行似乎有上面提到的问题,第四行打印出val ++的所有过程,而不是val ++的最终结果。

5 个答案:

答案 0 :(得分:2)

显然,您将打印出val的进度,因为您在此部分代码中拥有printf

        if(board[i][j] == board[i][j+1])
        {

            val++;
            printf("%d ", val); 
        } 

当您真正需要做的是跟踪有多少最后一个数字以及数字何时更改或您到达行尾时,您已经使代码过于复杂,然后输出计数。这样的事情可能是:

for(i = 0; i < height; i ++)
{
    val = 0;

    for(j = 0; j < width; j++)
    {
        if(board[i][j]>0)
        {
            if((j==0) || (board[i][j] != board[i][j-1]))
            {
                if(val)
                {
                    printf("%d ", val); 
                }
                val=1;
            }
            else
            {
                val++;
            }
        }   
    }
    if(val)
    {
        printf("%d ", val);
    }
    printf("\n");
}

使用您的示例输入

运行它
6 4
0 1 2 2 1 0
1 0 0 0 0 1
1 0 0 0 0 1
0 1 1 1 1 0

将输出显示为

1 2 1 
1 1 
1 1 
4 

答案 1 :(得分:0)

  

board [i] [j]!= board [i] [j-1]

你将j开始为0,所以你不能这样做。

不是将当前值(board [i] [j])与之前的值[i] [j - 1]进行比较,而是认为存储最后一个值更容易(prev = board [i] [j] )在j循环结束时,将当前值与该值进行比较。如果它是相同的,那么你可以增加你的计数器。

在循环之前,将prev设置为-1,这样如果它是第一列,则不要与prev进行比较。

答案 2 :(得分:0)

我稍微修改了你的代码

for(i = 0; i < height; i ++)
{
    val = 1;

    for(j = 0; j < width; j++)
    {

        if(board[i][j]>0)
        {   

            if(board[i][j] == board[i][j+1]) // same, increase val
            {
                val++;
            } 

            if(board[i][j+1] == 0 || board[i][j] != board[i][j+1]) // differ to next one, print out and reset val
            {
                printf("%d ", val); 
                val = 1;
            }

        }

    }   
    printf("\n");
}

答案 3 :(得分:0)

在设置val

之前,您想在块if(board[i][j+1]==0)中打印val=1;

答案 4 :(得分:0)

#define H 4
#define W 6

int a[H][W] = {
        {0,1,2,2,1,0},
        {1,0,0,0,0,1},
        {1,0,0,0,0,1},
        {0,1,1,1,1,0}
    };

void PrintRepeat() {
    for (int i = 0; i < H; i++) {
        int repeat = 0, prev = -1;
        for (int j = 0; j < W; j++) {
            if (a[i][j]){
                if (a[i][j] != prev) {
                    if (repeat) printf("%d ", repeat);
                    repeat = 1;
                }
                else repeat++; 
            }
            prev = a[i][j];
        }
        if (repeat) printf("%d\n", repeat);
    }
}

int main() {
    PrintRepeat();

    return 0;
}