我有这个矩阵:
1 2 3 4 5
6 7 8 9 A
B C D E F
0 1 2 3 4
我希望它在一行中打印如下:
1 6 2 B 7 3 0 C 8 4 1 D 9 5 2 E A 3 F 4.
最简单的方法是如何做到的?
答案 0 :(得分:1)
使用嵌套循环。 外环超过(0,0)
的距离内部循环遍历i和j的所有有效组合,总计到距离。
答案 1 :(得分:1)
#include <iostream>
int main(int argc, char **argv)
{
char m[4][5] = { { '1', '2', '3', '4', '5' },
{ '6', '7', '8', '9', 'A' },
{ 'B', 'C', 'D', 'E', 'F' },
{ '0', '1', '2', '3', '4' } };
for (int i = 0; i <= 3; ++i) {
for (int j = 0; j <= i; ++j) {
std::cout << m[i - j][j] << " ";
}
}
for (int i = 4; i <= 7; ++i) {
for (int j = i - 3; j <= 4; ++j) {
std::cout << m[i - j][j] << " ";
}
}
std::cout << std::endl;
return 0;
}
答案 2 :(得分:0)
如果矩阵以如下方式存储在数组中:
#include <stdio.h>
int main(void) {
char matrix[4][5] = {{'1','2','3','4','5'},
{'6','7','8','9','A'},
{'B','C','D','E','F'},
{'0','1','2','3','4'}};
int cols = 5;
int rows = 4;
int i = 0;
for( i = 0; i < cols + rows -2 ; i++){
int j = 0;
while(j <= i){
int k = i-j;
if(k < rows && j < cols){
printf("%c ",matrix[k][j]);
}
j++;
}
}
}
我只是从0到行和列的索引总数(在这种情况下从0到7) 对于每个索引总值,打印值与列和行的总和等于当前总索引,如果索引是可用的(小于列和行的索引),则打印它,否则转义。 例如:
0 - 00
1 - 10 01
2 - 20 11 02
顺便说一下,似乎需要比其他人更多的循环
答案 3 :(得分:0)
我建议矩阵的vector<vector<char> >
表示(如果我假设你在每个单元格中存储字符)。一个重要的观察是,对于每个对角线,你有i和j指数的总和是一个常数,对于对角线,这个总和增加一。
注意到这一点后,你在x坐标上的和和内循环上做了一个外循环。小心不要掉出矩阵! 现在,打印矩阵的最简单的c ++方法是:
vector<vector<char> > a;
for(unsigned sum = 0; sum < a.size() + a[0].size(); ++sum) {
for (unsigned j = 0; j <= sum && j < a[0].size(); ++j) {
unsigned i = sum - j;
if (i >= a.size()) {
continue;
}
cout << a[i][j] << " ";
}
}
可以通过更改起始值来优化j上的循环(以便继续条件永远不会成立),但代码将更难理解。我没有故意修复的另一个问题是,即使在最后一个元素之后也会打印出空白。这是另一个需要添加的检查。
希望这有帮助。
答案 4 :(得分:-1)
for( int i = 0; i < matrix.cx; i++ ) {
for( int j = 0; j < matrix.cy; j++ ) {
std::cout << matrix[i][j] << ' ';
}
// comment following line to make matrix printed in one line
std::cout << std::endl;
}