如何提取二维矩阵C+的同一对角线中的单元格索引+; 以上,我尝试只用C++来获取二维矩阵的元素 矩阵有MxN维,可能是N=M,N>=M或Mn>>m; std::向量结果; 对于(int k=0;kn>>m; std::向量结果; 对于(int k=0;k
视觉辅助: 我试图让第二个for循环从左上角开始遍历矩阵的彩色单元格,也就是说,在每个循环中,第二个循环遍历的单元格的数量/位置都在不断变化&我开始怀疑,在编译时不知道N&M的情况下,是否可以做到这一点 提前谢谢你的时间 ~EDIT1: 对于非正方形矩阵,元素的迭代是这样的(如果行多于列,则同样适用) ~2: 以下是迄今为止的代码:(可测试!)如何提取二维矩阵C+的同一对角线中的单元格索引+; 以上,我尝试只用C++来获取二维矩阵的元素 矩阵有MxN维,可能是N=M,N>=M或Mn>>m; std::向量结果; 对于(int k=0;kn>>m; std::向量结果; 对于(int k=0;k,c++,arrays,2d,C++,Arrays,2d,视觉辅助: 我试图让第二个for循环从左上角开始遍历矩阵的彩色单元格,也就是说,在每个循环中,第二个循环遍历的单元格的数量/位置都在不断变化&我开始怀疑,在编译时不知道N&M的情况下,是否可以做到这一点 提前谢谢你的时间 ~EDIT1: 对于非正方形矩阵,元素的迭代是这样的(如果行多于列,则同样适用) ~2: 以下是迄今为止的代码:(可测试!) #包括 #包括 #包括 使用名称空间std; 无效函数(void); //使用这些变量可以任意指定尺寸 //请记住,我需要这个来处理相对较大的矩阵
#包括
#包括
#包括
使用名称空间std;
无效函数(void);
//使用这些变量可以任意指定尺寸
//请记住,我需要这个来处理相对较大的矩阵
int行=5,列=5;
字符串arr[][10]={{“0”、“0”、“0”、“0”、“0”、“0”、“0”、“0”、“0”、“0”、“0”、“0”},
{"0", "1,1", "1,2", "1,3", "1,4", "1,5", "1,6", "1,7", "1,8", "1,9" },
{"0", "2,1", "2,2", "2,3", "2,4", "2,5", "2,6", "2,7", "2,8", "2,9" },
{"0", "3,1", "3,2", "3,3", "3,4", "3,5", "3,6", "3,7", "3,8", "3,9" },
{"0", "4,1", "4,2", "4,3", "4,4", "4,5", "4,6", "4,7", "4,8", "4,9" },
{"0", "5,1", "5,2", "5,3", "5,4", "5,5", "5,6", "5,7", "5,8", "5,9" },
{"0", "6,1", "6,2", "6,3", "6,4", "6,5", "6,6", "6,7", "6,8", "6,9" },
{"0", "7,1", "7,2", "7,3", "7,4", "7,5", "7,6", "7,7", "7,8", "7,9" },
{"0", "8,1", "8,2", "8,3", "8,4", "8,5", "8,6", "8,7", "8,8", "8,9" },
{"0", "9,1", "9,2", "9,3", "9,4", "9,5", "9,6", "9,7", "9,8", "9,9" } };
bool f=false,f2=false;
内部主(空)
{
func();
返回0;
}
无效函数(无效)
{
如果(行<列)
{
//还记得那一行吗
f=真;
}
无符号短m_i;//外部for循环(i)计数器的掩码-计算
unsigned short j_end=1;//存储内部循环应执行的最大迭代次数-相应递增
无符号短k=1;//存储内部循环的起始索引-开始递增一次(j_end==col)
cout代码:
#包括
#包括
#包括
int main(){
int n,m;
标准:cin>>n>>m;
std::向量结果;
对于(int k=0;k=0)
{
结果。推回({i,j});
i++;
j--;
}
}
对于(int k=1;k=0)
{
结果。推回({i,j});
i++;
j--;
}
}
返回0;
}
说明:
如果你看这张图片,你可以看到对角线是当你移动i+1和j-1时。直到上半部分,我们从第一行开始,并尝试沿着指定的方向前进。当我们到达终点时,我们只进入下一列。基本上,每一次迭代我们只是改变起点。第二部分有点棘手,因为我们已经完成了遍历了一些行,所以我们从1开始(因为我们已经遍历了第一行。然后应用与上半部分相同的方向,我们遍历了矩阵的其余部分。代码:
#include <vector>
#include <utility>
#include <iostream>
int main() {
int n, m;
std::cin >> n >> m;
std::vector<std::pair<int, int> > result;
for (int k = 0; k < m; k++) {
int i = 0, j = k;
while (i < n && j >= 0)
{
result.push_back({ i, j });
i++;
j--;
}
}
for (int k = 1; k < n; k++) {
int i = k, j = m - 1;
while (i < n && j >= 0)
{
result.push_back({ i, j });
i++;
j--;
}
}
return 0;
}
for( int manhattan_distance = 0; manhattan_distance < M + N - 1; ++manhattan_distance )
{
for( int i = 0; i <= manhattan_distance; ++i )
{
int j = manhattan_distance - i;
if( j < N && i < M )
{
...
}
}
}
#包括
#包括
#包括
int main(){
int n,m;
标准:cin>>n>>m;
std::向量结果;
对于(int k=0;k=0)
{
结果。推回({i,j});
i++;
j--;
}
}
对于(int k=1;k=0)
{
结果。推回({i,j});
i++;
j--;
}
}
返回0;
}
说明:
如果你看这张图片,你可以看到对角线是当你移动i+1和j-1时。直到上半部分,我们从第一行开始,并尝试沿着指定的方向前进。当我们到达终点时,我们只进入下一列。基本上,每一次迭代我们只是改变起点。第二部分有点棘手,因为我们已经完成了遍历了一些行,所以我们从1开始(因为我们已经遍历了第一行。然后应用与上半部分相同的方向,我们遍历了矩阵的其余部分。for(int manhattan_distance=0;manhattan_distancefor( int manhattan_distance = 0; manhattan_distance < M + N - 1; ++manhattan_distance )
{
for( int i = 0; i <= manhattan_distance; ++i )
{
int j = manhattan_distance - i;
if( j < N && i < M )
{
...
}
}
}
{
for(int i=0;ifor(int曼哈顿距离=0;曼哈顿距离 对于(int i=0;i你可以这样做:
void foo(int rows,int cols){
// first go vertically down
for (int start_row = 0;start_row<rows;start_row++){
int col = 0;
int row = start_row;
while (col < cols && row >= 0){
std::cout << row << "," << col << " ";
row--;
col++;
}
std::cout << std::endl;
}
// now horizantally
for (int start_col = 0;start_col<cols;start_col++){
int col = start_col;
int row = rows-1;
while (col < cols && row >= 0){
std::cout << row << "," << col << " ";
row--;
col++;
}
std::cout << std::endl;
}
}
void foo(int行,int列){
//首先垂直向下
对于(int start_row=0;start_row=0){
std::cout您可以这样做:
void foo(int rows,int cols){
// first go vertically down
for (int start_row = 0;start_row<rows;start_row++){
int col = 0;
int row = start_row;
while (col < cols && row >= 0){
std::cout << row << "," << col << " ";
row--;
col++;
}
std::cout << std::endl;
}
// now horizantally
for (int start_col = 0;start_col<cols;start_col++){
int col = start_col;
int row = rows-1;
while (col < cols && row >= 0){
std::cout << row << "," << col << " ";
row--;
col++;
}
std::cout << std::endl;
}
}
void foo(int行,int列){
//首先垂直向下
对于(int start_row=0;start_row=0){
好吧,我得到了一个答案,所有人都认为它不够精致。
它工作正常,但未进行优化
<>编辑:C……没有看到它是C++的,但是这个想法是相同的< /P>
using System;
Random r = new Random();
int rows = r.Next(10,13); // or any range of rows
int cols = r.Next(10,20); // same applies
int[,] matrix = new int[rows,cols];
// mark upper diagonal
for(var i=0; i<= cols; i++)
markByCol(i,0,cols-i);
// mark lower diagonal
for(var i=1; i<= rows; i++)
markByCol(cols+1+i,i,cols-1);
// stringify matrix to view it properly
string line = string.Empty;
for(int i=0; i< rows; i++)
{
line = string.Empty;
for(int j=0; j< cols; j++)
{
line+= matrix[i,j]+" | ";
}
Console.WriteLine(line);
}
// the actual function
int markByCol(int marker,int row,int col){
if((row > -1 && row < rows) && (col > -1 && col < cols))
{
matrix[row,col] = marker;
return markByCol(marker,row+1,col-1);
}
else
return 0;
}
使用系统;
随机r=新随机();
int rows=r.Next(10,13);//或任意范围的行
int cols=r.Next(10,20);//同样适用
int[,]矩阵=新的int[行,列];
//标记上对角线
对于(变量i=0;i-1&&col