在4x4网格上生成模式

时间:2014-01-24 14:29:57

标签: c

我想使用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);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

崩溃是因为它无限递归地调用pattern()。似乎没有任何代码在矩阵中放置九个'1'。这些例子并不清楚,因为从一行到下一行的重叠确实出现了 - 我猜你的意思只是每行重叠。

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