C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++でマトリックス内のソート済み行をすべてカウントする方法

このチュートリアルでは、行列(マトリックス)の中から「ソート済みの行」がいくつあるかを数えるC++プログラムについて解説します。

具体的には、m×n のサイズの行列が与えられ、その中から昇順または降順のいずれかで整列されている行をすべてカウントするのが課題です。

アルゴリズムのポイント

各行に対して以下の2つの判定を行い、どちらかに該当すればカウントします。

  • 昇順の判定:各行を左から右へ走査し、隣接する要素が常に増加していれば昇順とみなします。
  • 降順の判定:各行を右から左へ走査し、隣接する要素が常に減少していれば降順とみなします。

計算量は O(m×n) となり、行列の全要素を一度ずつ確認するだけで効率的に処理できます。

サンプルコード

#include <bits/stdc++.h>
#define MAX 100
using namespace std;
// ソート済みの行をカウントする関数
int count_srows(int mat[][MAX], int r, int c){
    int result = 0;
    // 昇順の行をチェック
    for (int i=0; i<r; i++){
        int j;
        for (j=0; j<c-1; j++)
        if (mat[i][j+1] <= mat[i][j])
           break;
        if (j == c-1)
           result++;
    }
    // 降順の行をチェック
    for (int i=0; i<r; i++){
        int j;
        for (j=c-1; j>0; j--)
           if (mat[i][j-1] <= mat[i][j])
              break;
        if (c > 1 && j == 0)
           result++;
    }
    return result;
}
int main(){
    int m = 4, n = 5;
    int mat[][MAX] = {{1, 2, 3, 4, 5}, {4, 3, 1, 2, 6}, {8, 7, 6, 5, 4}, {5, 7, 8, 9, 10}};
    cout << count_srows(mat, m, n);
    return 0;
}

実行結果

3

結果の解説

この例では、以下の3つの行がソート済みと判定されています。

  • {1, 2, 3, 4, 5} … 昇順
  • {8, 7, 6, 5, 4} … 降順
  • {5, 7, 8, 9, 10} … 昇順

一方、{4, 3, 1, 2, 6} は増減が混在しているため、カウント対象外となります。

  1. 【C++】文字列のすべての順列を辞書式順序(ソート順)で出力する方法

    問題概要この問題では、長さ n の文字列が与えられ、その文字を並べ替えてできるすべての順列を、ソートされた順序(辞書式順序)で出力することが求められます。具体例を使って問題を確認してみましょう。入力: 「XYZ」出力: XYZ、XZY、YXZ、YZX、ZXY、ZYXつまり、すべての順列を辞書式順序(アルファベット昇順)で列挙して出力する必要があります。解決のアプローチこの問題を解くための基本的な手順は以下の通りです。まず文字列全体をアルファベット昇順にソートします。ソート後の文字列が順列の最初の要素になります。現在の順列から「次に大きい順列」を繰り返し生成していきます。「次の順列」を求める処理

  2. C++で各行がソートされた行列の全行に共通する要素を効率的に見つける方法

    はじめに各行が昇順にソートされた行列(2次元配列)が与えられたとします。このとき、すべての行に共通して存在する要素を見つける関数を作成する必要があります。例として、次のような行列を考えてみましょう。この行列の場合、すべての行に共通して現れる要素は 5 となります。解決アプローチ:ハッシュテーブルを活用この問題を解くには、ハッシュテーブル(連想配列)を利用したアプローチが有効です。この手法の大きな利点は、行がソートされていない場合でも同様に適用できるという点です。アルゴリズムの手順以下の手順に従って処理を進めます。ステップ1: まず、1行目の各行の要素(重複を除く)をキーとしてハッシュテーブルを