私はこのマトリックスを持っています:
1 2 3 4 5
6 7 8 9 A
B C D E F
0 1 2 3 4
そして、次のように1行で印刷したい:
1 6 2 B 7 3 0 C 8 4 1 D 9 5 2 E A 3 F 4.
それを行う最も簡単な方法は何ですか?
#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;
}
ネストされたループを使用します。外側のループは (0,0) からの距離にあります
距離を合計する i と j のすべての有効な組み合わせに対する内部ループ。
マトリックスの表現をお勧めvector<vector<char> >
します(各セルに文字を格納すると仮定した場合)。重要な観察事項は、各対角線について i と j インデックスの合計が定数であり、この合計が対角線に対して 1 増加することです。
これに気付いたので、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 のサイクルを最適化できますが、コードは理解しにくくなります。意図的に修正しなかったもう 1 つの欠点は、最後の要素の後にも空白が出力されることです。これは、追加する必要があるもう 1 つのチェックです。
お役に立てれば。
行列が次のような配列に格納されている場合:
#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
ところで、他のループよりも多くのループが必要なようです
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;
}