我想使用C生成模式,以便在4x4网格上9个元素应为1,其余元素为0。9个元素应在4,3和2的组中,以便一个组在水平或垂直方向上的值为1 。另外,不应有1的重叠。以下是一些示例:

例1

1111
1101
0001
0001


例2

1011
1100
1100
1100


但它不应该显示这样的内容(重叠)

0111
0100
0100
1100


我编写了以下代码来生成上述模式,但是它大多失败(segmentation fault)或给出了错误的模式(1的重叠):

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void pattern(int num, int arr[][4], int checkcol[], int checkrow[]);

int main() {
    int i,j, arr[4][4], checkcol[4], checkrow[4];
    for(i=0; i<4; i++) {
        checkcol[i] = -1;
        checkrow[i] = -1;
        for(j=0; j<4; j++)
            arr[i][j] = 0;
    }

    for(i=4; i>1; i--)
        pattern(i, arr, checkrow, checkcol);

    for(i=0; i<4; i++) {
        for(j=0; j<4; j++) {
            printf("%d", arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}

void pattern(int n, int arr[][4], int checkcol[], int checkrow[]) {
    int i;
    srand (time(NULL));

    //random number to decide whether to put 1's horizontally or vertically
    int rc = rand()%2;

    //random number to decide to put 1's in which row/column
    int num = rand()%4;

    if(rc) {
            //checks if the column has not already been marked
        if(checkcol[num]!=1) {
            for(i=0; i<n; i++)
                arr[i][num] = 1;

            checkcol[num] = 1;
        }
        else {
            pattern(n, arr, checkrow, checkcol);
        }
    }
    else {
            //checks if the row has not already been marked
        if(checkrow[num]!=1) {
            for(i=0; i<n; i++)
                arr[num][i] = 1;

            checkrow[num] = 1;
        }
        else {
            pattern(n, arr, checkrow, checkcol);
        }
    }
}

最佳答案

它崩溃是因为它无限递归地调用pattern()。同样,似乎也没有任何代码在矩阵中放置九个“ 1”。这些示例不清楚,因为确实出现了从一行到另一行的重叠-我想您的意思是仅每行重叠。

我认为真正的答案是重写代码。可以简化。仅使用16个元素的一维数组将大大简化编码。我个人将避免使用递归解决方案,除非有理由这样做。当然,您可能希望学习此技术。

08-26 18:00