C++ 如何只浏览任何方阵的北部、南部、东部和西部(而不浏览整个方阵)?
i和j在for内应该有什么限制,以便只通过中的高滑动区域(没有对角线) ? 四个区域各一对两个for:C++ 如何只浏览任何方阵的北部、南部、东部和西部(而不浏览整个方阵)?,c++,matrix,C++,Matrix,i和j在for内应该有什么限制,以便只通过中的高滑动区域(没有对角线) ? 四个区域各一对两个for: for(i=?;i<?;i?) for(j=?;j<?;j?) cout<<matrix[i][j]; for(i=?;i我认为“不遍历整个矩阵”是一个奇怪的要求。以某种方式,你必须遍历整个矩阵。只需跳过某些元素。因此,为了这个答案,我将忽略该要求;) 您没有指定矩阵的类型,因此我假设它是一个数组数组 std::array< std::a
for(i=?;i<?;i?)
for(j=?;j<?;j?)
cout<<matrix[i][j];
for(i=?;i我认为“不遍历整个矩阵”是一个奇怪的要求。以某种方式,你必须遍历整个矩阵。只需跳过某些元素。因此,为了这个答案,我将忽略该要求;)
您没有指定矩阵的类型,因此我假设它是一个数组数组
std::array< std::array<double,N> , N> matrix;
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
if ( i == j) continue; // skip diagonal
if ( i + j == N) continue; // skip anti-diagonal
std::cout << i << " " << j << " " << matrix[i][j] << '\n';
}
}
此代码为北部生成正确的输出:
#include <iostream>
#include <string>
#include <vector>
struct Index
{
int i;
int j;
void out(){std::cout << i << "," << j << " ";}
};
int size = 8;
int main()
{
std::vector<std::vector<Index>> Matrix(size);
for(int i=0; i<size; ++i)
{
for(int j=0; j<size; ++j)
{
Index Idx;
Idx.i = i;
Idx.j = j;
Matrix[i].push_back(Idx);
Idx.out();
}
std::cout <<std::endl;
}
std::cout << "--------------------------" <<std::endl;
int half_size = size/2;
for(int i=0; i<half_size; ++i)
{
for(int j=i+1; j<size-i-1; ++j)
{
Matrix[i][j].out();
}
}
}
对于南部、东部和西部,请修改我的解决方案。您尝试了什么?你有一个关于所有索引的例子,首先写一个循环(4x4),然后试着概括为什么不通过整个矩阵?排除对角线比单独获取其他四个部分要容易得多。实际上,您的示例有点小。你想得到没有对角线的整个矩阵,还是只得到矩阵每边的一行/列(图中相同)。从你的帖子我想这是第一次,但我有点不确定。此外,你对元素的传递顺序有要求吗?“不经过整个矩阵”确实是一个奇怪的要求。但这是要求!
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
auto l = localize(i,j);
if (l == NORTH) do_something_with_north_elements(i,j,matrix[i][j]);
else if (l == EAST) do_something_with_east_elements(i,j,matrix[i][j]);
// ...
}
#include <iostream>
#include <map>
#include <functional>
int main() {
std::map<Location,std::function<void()>> do_something {
{ NORTH, [](){std::cout << 'n';} },
{ EAST, [](){std::cout << 'e';} },
{ SOUTH, [](){std::cout << 's';} },
{ WEST, [](){std::cout << 'w';} },
{ DIAG, [](){std::cout << 'd';} },
{ UNDEFINED,[](){std::cout << 'x';} }
};
const int N = 4;
for (int i=0;i<N;++i) {
for (int j=0;j<N;++j) {
do_something[ localize(i,j,N) ]();
}
std::cout << '\n';
}
}
dssd
wdde
wdde
dnnd
#include <iostream>
#include <string>
#include <vector>
struct Index
{
int i;
int j;
void out(){std::cout << i << "," << j << " ";}
};
int size = 8;
int main()
{
std::vector<std::vector<Index>> Matrix(size);
for(int i=0; i<size; ++i)
{
for(int j=0; j<size; ++j)
{
Index Idx;
Idx.i = i;
Idx.j = j;
Matrix[i].push_back(Idx);
Idx.out();
}
std::cout <<std::endl;
}
std::cout << "--------------------------" <<std::endl;
int half_size = size/2;
for(int i=0; i<half_size; ++i)
{
for(int j=i+1; j<size-i-1; ++j)
{
Matrix[i][j].out();
}
}
}
0,0 0,1 0,2 0,3 0,4 0,5 0,6 0,7
1,0 1,1 1,2 1,3 1,4 1,5 1,6 1,7
2,0 2,1 2,2 2,3 2,4 2,5 2,6 2,7
3,0 3,1 3,2 3,3 3,4 3,5 3,6 3,7
4,0 4,1 4,2 4,3 4,4 4,5 4,6 4,7
5,0 5,1 5,2 5,3 5,4 5,5 5,6 5,7
6,0 6,1 6,2 6,3 6,4 6,5 6,6 6,7
7,0 7,1 7,2 7,3 7,4 7,5 7,6 7,7
--------------------------
0,1 0,2 0,3 0,4 0,5 0,6 1,2 1,3 1,4 1,5 2,3 2,4