C++ 如何只浏览任何方阵的北部、南部、东部和西部(而不浏览整个方阵)?

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

i和j在for内应该有什么限制,以便只通过中的高滑动区域(没有对角线) ?

四个区域各一对两个for:

 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