C言語で行列の要素を斜め下方向に出力するプログラム
n×nサイズの配列が与えられたとき、その整数型の行列要素を斜め下方向に出力するのが課題です。
「斜め下方向」とは、任意のn×nサイズの配列を、下図のように左上から右下へ斜めに移動しながら順番に出力することを意味します。
具体的には、まず「1」を出力し、次に「2」を出力した後、斜め下の「4」へ移動して出力します。この操作を行列のすべての要素に対して繰り返していきます。
入力例と出力例
入力:Matrix [3][3] = {
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 }}
出力:1 2 4 3 5 7 6 8 9アルゴリズム
int diagonally_down(int mat[n][n]) START STEP 1: i, j, row, col を INT 型として宣言 STEP 2: FOR ループ(i = 0、i < n、i++) row = 0 を設定 col = i を設定 WHILE ループ(col >= 0 の間) mat[row][col] を出力 row を 1 増やし、col を 1 減らす END WHILE END FOR STEP 3: FOR ループ(j = 1、j < n、j++) row = j を設定 col = n-1 を設定 WHILE ループ(row < n の間) mat[row][col] を出力 row を 1 増やし、col を 1 減らす END WHILE END FOR STOP
C言語による実装例
#include <stdio.h>
#define n 3
int diagonally_down(int mat[n][n]){
int i, j, row, col;
//上側の対角線部分の要素を出力
for (i = 0; i < n; i++){
row = 0;
col = i;
while(col >= 0) //最初の行から下方向へ移動{
printf("%d ", mat[row++][col--]);
}
}
//下側の対角線部分の要素を出力
for (j = 1; j < n; j++){
row = j;
col = n-1;
while(row<n) //最後の列から移動を開始{
printf("%d ", mat[row++][col--]);
}
}
}
int main(int argc, char const *argv[]){
int mat[][n] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
diagonally_down(mat);
return 0;
}実行結果
上記のプログラムをコンパイルして実行すると、以下の出力が得られます。
1 2 4 3 5 7 6 8 9
このアルゴリズムでは、行列を2つのフェーズに分けて処理しています。第1フェーズでは1行目の各要素から始まる対角線に沿って左下方向へ走査し、第2フェーズでは最終列の各要素から始まる残りの対角線を走査します。これにより、行列全体を漏れなく斜め下方向の順序で出力できます。
-
C++で行列の各列の0の個数に基づいて列をソートし、インデックスを出力する方法
N行M列のサイズを持つ行列が与えられたとき、各列に含まれる0の個数を数え、その個数に基づいて列をソートし、ソート後の列のインデックスを出力するのが課題です。 例えば、1列目に0が1つ含まれ、2列目には0がまったく含まれず、3列目に0が2つ含まれている場合、0の少ない順に並べると出力は「2 1 3」になります。 入力例と出力例 Input: 0 0 0 1 1 1 1 0 1 Output: 1 3 2 解説 上記の入力における各列の0の個数は次のとおり
-
Cプログラムで2次元行列の四隅の要素とその合計を出力する方法
概要 サイズ2×2以上の2次元配列(行列)が与えられたとき、その四隅に格納されているすべての要素を取り出し、合計を求めて出力するのが本記事のテーマです。 四隅の要素とは? 行数「r」、列数「c」(いずれも0から開始)をもつ行列 mat[r][c] を考えると、四隅の要素は次の4つになります。 左上:mat[0][0] 右上:mat[0][c-1] 左下:mat[r-1][0] 右下:mat[r-1][c-1] したがって、求める合計は次の式で表されます。mat[0][0] + mat[0][c-1] + mat[r-1][0] + mat[r-1][c-1]これらの四隅の要素を取得して加算