【问题标题】:Adding values in multi-array but it goes out of bounds在多数组中添加值但超出范围
【发布时间】:2018-05-09 07:39:50
【问题描述】:

我需要为数组中的每个位置计算它周围有多少个 1 值。我尝试在其周围添加另一层 0,如果 r=1 会起作用,但在例如 r = 3 时无法弄清楚?

#include <iostream>
#include <time.h>
#include <cstdlib>
using namespace std;

int main() 
{
const int n=10;

int T[n][n]= {
    {1,0,0,0,1,0,1,0,0,1},
    {1,1,0,0,1,0,1,1,1,0},
    {0,1,0,0,1,0,1,0,0,1},
    {0,1,1,0,1,0,1,1,0,1},
    {0,1,0,1,1,0,0,0,0,0},
    {0,1,0,1,1,0,0,0,1,0},
    {1,1,0,0,1,0,0,0,0,1},
    {1,1,1,1,1,0,1,1,0,0},
    {0,1,0,0,1,0,1,0,0,1},
    {1,1,0,0,1,0,0,1,0,1},
};

int TD[14][14]= {0};

for(int i=2; i<12; i++) 
    for(int j=2; j<12; j++)
        TD[i][j]=T[i-2][j-2];

for(int i=0; i<14; i++) 
{
    for(int j=0; j<14; j++)
        cout<<TD[i][j]<<" ";
    cout<<endl;
}

cout<<endl<<endl<<endl;

for(int i=0; i<n; i++) 
{
    for(int j=0; j<n; j++)
        cout<<T[i][j]<<" ";
    cout<<endl;
}

cout<<endl;
cout<<endl;
cout<<endl;

int G[14][14]= {0};

for(int i=0; i<n; i++) 
{
    for(int j=0; j<n; j++)
        cout<<G[i][j]<<" ";
    cout<<endl;
}

cout<<endl;
cout<<endl;
cout<<endl;

int r=1;

for(int i=2; i<13; i++)
    for(int j=2; j<13; j++) 
    {
        for(int ii=i-r; ii<=i+r; ii++)
            for(int jj=j-r; jj<=j+r; jj++)
                G[i][j]=G[i][j]+TD[ii][jj];
    }

for(int i=2; i<12; i++) 
{
    for(int j=2; j<12; j++)
        cout<<G[i][j]<<" ";
    cout<<endl;
}
return 0;   

我尝试随着数组的增加增加0s 的层数,但这不起作用。

所以我的问题是:如果这种方法很好,如果不是,你们可以建议什么样的解决方案?

【问题讨论】:

  • 为什么要声明这么多数组。如果你真的只想计算每个索引的 1,你只需要第二个相同维度的数组。
  • 到底是什么问题(或您的问题?)。我只是将您的代码复制粘贴到 IDE 中,它运行时没有错误...
  • 尝试将 r 变量切换为大于 1 它将完全从 b 到 wallz。 T-array 是 1 和 0 所在的位置。 TD 数组是具有扩展边界(另一层 0)的数组,我只是在其中敲击了 T 数组。最后一个用于计数 1。乞求的问题很简单:“如果 r=1 但在例如 r=3 时无法弄清楚?”就像问题的头
  • 只需修改您的代码,使其不会越界访问数组。并且不要使用诸如 12、13 之类的幻数,而是使用常量。

标签: c++ algorithm multidimensional-array count


【解决方案1】:

当您在单元格的固定 2D 映射中计算任何问题时,要确定“邻居”的数量需要识别和“边界”单元格和“内部”单元格,然后编写一个围绕每个边界工作的算法,以及遍历每个内部单元格。

以下示例首先读取顶行边界,然后是左边界,然后是内部,然后是右边界,最后是底行。代码不考虑单元格本身的值(意思是cell[i][j] 从围绕它的可能的 8 个单元格中计数,但如果它恰好是1,则在确定邻居计数时不包括它自己的值。 (您可以通过激活邻居计数的每个部分中的注释单元格轻松地根据需要进行调整。

总而言之,您可以执行以下操作:

#include <iostream>
#include <time.h>
#include <cstdlib>

#define n 10

int main (void) {

    int T[][n]= {
        {1,0,0,0,1,0,1,0,0,1},
        {1,1,0,0,1,0,1,1,1,0},
        {0,1,0,0,1,0,1,0,0,1},
        {0,1,1,0,1,0,1,1,0,1},
        {0,1,0,1,1,0,0,0,0,0},
        {0,1,0,1,1,0,0,0,1,0},
        {1,1,0,0,1,0,0,0,0,1},
        {1,1,1,1,1,0,1,1,0,0},
        {0,1,0,0,1,0,1,0,0,1},
        {1,1,0,0,1,0,0,1,0,1},
    },
    nrow = sizeof T / sizeof *T,
    ncol = n,
    neighbors = 0;

    for (int i = 0; i < nrow; i++) {    /* loop over rows */
        for (int j = 0; j < n; j++) {   /* loop over cols */
            if (!i) {       /* index of first row */
                if (!j) {       /* top-left corner */
                    neighbors = /*T[i][j]*/   T[ i ][j+1] + 
                                T[i+1][ j ] + T[i+1][j+1];
                }
                else if (j < ncol - 1) {    /* top-inside row */
                    neighbors = T[ i ][j-1] + /*T[i][j]*/ + T[ i ][j+1] +
                                T[i+1][j-1] + T[i+1][ j ] + T[i+1][j+1];
                }
                else if (j == ncol - 1) {   /* top-right corner */
                    neighbors = T[ i ][j-1] + /*T[i][j]*/ 
                                T[i+1][j-1] + T[i+1][ j ];
                }
            }
            else if (i < nrow - 1) {    /* interior cells */
                if (!j) {       /* left-side vertical */
                    neighbors = T[i-1][ j ] + T[i-1][j+1] +
                                /*T[i][j]*/ + T[ i ][j+1] +
                                T[i+1][ j ] + T[i+1][j+1];
                }
                else if (j < ncol - 1) {    /* inner cells */
                    neighbors = T[i-1][j-1] + T[i][j-1] + T[i+1][j-1] +
                                T[i-1][ j ] + /*T[i][j]*/ T[i+1][ j ] +
                                T[i-1][j+1] + T[i][j+1] + T[i+1][j+1];
                }
                else if (j == ncol - 1) {   /* right-side vertical */
                    neighbors = T[i-1][j-1] + T[i-1][ j ] +
                                T[ i ][j-1] + /*T[i][j]*/
                                T[i+1][j-1] + T[i+1][ j ];
                }
            }
            else if (i == nrow - 1) {   /* last row */
                if (!j) {       /* bottom-left corner */
                    neighbors = T[i-1][ j ] + T[i-1][j+1] +
                                /*T[i][j]*/ + T[ i ][j+1];
                }
                else if (j < ncol - 1) {    /* bottom-inside row */
                    neighbors = T[i-1][j-1] + T[i-1][ j ] + T[i-1][j+1] +
                                T[ i ][j-1] + /*T[i][j]*/ + T[ i ][j+1];
                }
                else if (j == ncol - 1) {   /* bottom-right corner */
                    neighbors = T[i-1][j-1] + T[i-1][ j ] +
                                T[ i ][j-1]   /*T[i][j]*/;
                }
            }
            std::cout << "T[" << i << "][" << j << "]: " << neighbors << '\n';
        }
    }
}

使用/输出示例

$ ./bin/neighbors
T[0][0]: 2
T[0][1]: 3
T[0][2]: 1
T[0][3]: 2
T[0][4]: 1
T[0][5]: 4
T[0][6]: 2
T[0][7]: 4
T[0][8]: 3
T[0][9]: 1
T[1][0]: 3
T[1][1]: 3
T[1][2]: 2
T[1][3]: 3
T[1][4]: 2
T[1][5]: 6
T[1][6]: 3
T[1][7]: 4
T[1][8]: 3
T[1][9]: 3
...
T[8][0]: 5
T[8][1]: 5
T[8][2]: 5
T[8][3]: 5
T[8][4]: 3
T[8][5]: 5
T[8][6]: 3
T[8][7]: 4
T[8][8]: 4
T[8][9]: 1
T[9][0]: 2
T[9][1]: 2
T[9][2]: 2
T[9][3]: 2
T[9][4]: 1
T[9][5]: 3
T[9][6]: 2
T[9][7]: 1
T[9][8]: 3
T[9][9]: 1

查看一下,如果您有任何其他问题,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 2014-05-23
    • 2018-08-04
    • 2021-10-04
    相关资源
    最近更新 更多