我想使用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);
}
}
}
答案 0 :(得分:0)
崩溃是因为它无限递归地调用pattern()
。似乎没有任何代码在矩阵中放置九个'1'。这些例子并不清楚,因为从一行到下一行的重叠确实出现了 - 我猜你的意思只是每行重叠。
我认为真正的答案是重写代码。它可以简化。仅使用16个元素的一维数组将大大简化编码。我个人会避免递归解决方案,除非有理由这样做。当然,您可能希望学习这种技术。