我想使用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个元素的一维数组将大大简化编码。我个人将避免使用递归解决方案,除非有理由这样做。当然,您可能希望学习此技术。