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

C++で文字列を「+」パターンで行列に出力する方法

文字列 str が与えられたとき、その文字列を行列に「+」パターンで出力する必要があります。「+」パターンを形成するには、行列が正方行列(行数と列数が同じ行列)である必要があります。

例えば「Tutor」という文字列が与えられた場合、文字列を中央で交差するように水平方向と垂直方向の両方に出力し、行列の残りの要素はすべて「x」で埋めます。イメージは以下の図の通りです。

C++で文字列を「+」パターンで行列に出力する方法

入力例と出力例

入力

str[] = {"Point"}

出力

C++で文字列を「+」パターンで行列に出力する方法

入力

str[] = {"this"}

出力

パターンを作成できません

偶数長の文字列では中央にあたる1文字が存在しないため、十字の交点を正しく配置できず、パターンを作成できません。そのため、文字列の長さは奇数である必要があります。

解決のためのアプローチ

  • 入力を受け取ります。

  • 文字列の長さが偶数でないこと(奇数であること)を確認します。

  • 最初に行列全体を「x」で初期化します。

  • 中央の行と中央の列に文字列を配置します。

  • 結果の行列を出力します。

アルゴリズム

開始
関数 int stringcross(char str[], int n) 内
    ステップ1 → n % 2 == 0 の場合、
        ステップ2 → 「パターンを作成できません」と出力
    ステップ3 → それ以外の場合
        str2[max][max] を宣言
        m を宣言し、n / 2 に設定
        i = 0 から i < n まで i++ の間
            j = 0 から j < n まで j++ の間
                str2[i][j] を 'x' に設定
        i = 0 から i < n まで i++ の間
            str2[i][m] を str[i] に設定
        i = 0 から i < n まで i++ の間
            str2[m][i] を str[i] に設定
        i = 0 から i < n まで i++ の間
            j = 0 から j < n まで j++ の間
                str2[i][j] を出力
            改行を出力
関数 int main() 内
    ステップ1 → str[] を "TUTOR" として宣言・初期化
    ステップ2 → n を文字列のサイズで宣言・初期化
    ステップ3 → stringcross(str, n-1) を呼び出す
終了

実装例

#include <stdio.h>
#define max 100
int stringcross(char str[], int n){
    if (n % 2 == 0){
        // 奇数長の文字列のみパターン化可能
        printf("パターンを作成できません\n");
    }
    else {
        // 2次元文字配列を宣言
        char str2[max][max];
        int m = n / 2;
        // 最初にすべての要素を 'x' に設定
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                str2[i][j] = 'x';
            }
        }
        // 文字列を十字になるように配置
        for (int i = 0; i < n; i++){
            // 中央の列
            str2[i][m] = str[i];
        }
        for (int i = 0; i < n; i++){
            // 中央の行
            str2[m][i] = str[i];
        }
        // 出力
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                printf("%c ",str2[i][j]);
            }
            printf("\n");
        }
    }
    return 0;
}
int main(){
    char str[] = {"TUTOR"};
    int n = sizeof(str)/sizeof(str[0]);
    stringcross(str, n-1);
    return 0;
}

出力

上記のコードを実行すると、以下のような出力が生成されます。

x x T x x
x x U x x
T U T O R
x x O x x
x x R x x

「TUTOR」は5文字(奇数)なので、3行目と3列目が中央となり、文字列が十字に配置されます。中央の交点には文字列の中央の文字「T」が表示され、それ以外のマスには「x」が表示されます。

  1. C++で解く「Maze III」:ボールを最短距離で穴に落とすアルゴリズム

    問題の概要 空きスペースと壁からなる迷路の中に、ボールが1つ置かれています。ボールは空きスペース上を上(u)・下(d)・左(l)・右(r)のいずれかの方向に転がって移動できますが、壁にぶつかるまで停止しません。ボールが停止した時点で、次の方向を選択できます。また、迷路内には穴(hole)が1つあり、ボールが穴の位置まで転がると、その穴に落ちます。 ボールの初期位置・穴の位置・迷路の情報が与えられたとき、ボールを最短距離で穴に落とすための移動手順を求めます。ここでいう距離とは、スタート地点(含まない)から穴(含む)までにボールが通過した空きスペースの数として定義されます。 移動方向は「u」「d

  2. C++で解くスパイラル行列 III:時計回りに全マスを訪問するアルゴリズム

    本記事では、R行C列の2次元グリッドを時計回りの渦巻き(スパイラル)状に巡回し、すべてのマスを訪問した順に座標を求める問題「スパイラル行列 III」をC++で解く方法を解説します。 問題の概要 R行C列の2次元グリッドを考えます。スタート地点は (r0, c0) で、最初は東向きに面しています。グリッドの北西の角は第1行・第1列に位置し、南東の角は最終行・最終列にあります。 私たちは時計回りの渦巻き状に歩きながら、グリッド内のすべてのマスを訪問します。途中でグリッドの境界外に出た場合でも、そのまま外側を歩き続け、後で再びグリッド内に戻ることがあります。 求めるのは、訪問した順番に並べたグリッド