我在C中编写了一个生活游戏,它运行得很安静,游戏板的唯一问题是比显示的大得多。我知道显示器可以显示的行数和列数,我认为按照动作这样说(搜索人口最多的区域)是一个好主意。因此,我写了一个小函数来接收我应该显示的字段部分角落的4个索引,但不知何故,代码似乎给出了随机部分,有时是不经意的错误,活细胞的计算值(最大)是完全错误的(有时甚至比它自己的整个矩阵还要大)。这是代码:
int* most_populated_area(int m, int n, bool a[m][n], int r, int c){
int * rr=malloc(sizeof(int)*4); //return value
rr[0]=0;
rr[1]=r;
rr[2]=0;
rr[3]=c; //we first assume that the most populated arrea is upper left corner
int summe=0;
int max=0; //to controll wheater or not we found a more populated area we need a summe and the max we founded until now
for(int isearch=0; isearch<m; isearch++){ //we search the matrix row for row
for(int jsearch=0; jsearch<n; jsearch++){ // and column for column
for(int ik=0; ik<=r; ik++){ // now from the current flied we go as many rows we are allowed
for(int jl=0; jl<=c; jl++){ //and also as many columns we are allowed to go
int iks=isearch+ik; //we looking on the field is 0 to r
int jls=jsearch+jl; //and 0 to c flieds away from our current field
if(iks>=m){ //if the field is outside the matrix we have to go back
iks%=r; // iks is clearly bigger than r (because m bigger than r) but iks%r can be r-1 at most,
//so we have the rest from iks through r over the edge
}
if(jls>=n){ //analog to iks
jls%=c;
}
summe+=a[iks][jls];
}
}
if(summe>max){// the summe is greater than the max we found a more populated area and we save the the results
max=summe;
rr[0]=isearch;
rr[1]=(isearch+r>=m)?(isearch+r)%r:isearch+r;
rr[2]=jsearch;
rr[3]=(jsearch+c>=n)?(jsearch+c)%c:jsearch+c;
}
summe=0; //anyway we reset the summe to search accurate
}
}
printf("Lifing in this area %d \n", max);
return rr;
}
答案 0 :(得分:0)
有一个近似的解决方案是O(n)。
将电路板拆分为x和y组件,并搜索人口最多的X和Y值。然后将它们设置为要显示的中点(调整边缘)。