在多数组中添加值,但它超出了界限
Adding values in multi-array but it goes out of bounds
我需要计算数组中的每个位置周围有多少个 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
层,但这行不通。
所以我的问题是:如果这种方法很好,如果不是,你们可以提出什么样的解决方案?
当处理在固定的单元格 2D 映射内计数的任何问题时,要确定"邻居"的数量需要识别和"边界"单元格和"内部"单元格,然后编写围绕每个边界工作的算法,以及迭代每个内部单元格。
下面的示例首先读取顶行边界,然后向下读取左边界,穿过内部,然后读取右边界,最后读取底行。该代码不考虑单元格本身的值(意味着从围绕它的可能的 8 个单元格中cell[i][j]
计数,但在确定邻居计数时不包括它自己的值(如果它恰好是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
仔细看看,如果您有任何其他问题,请告诉我。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '