造字程式

題目說明

仔細看完題目後就會發現,其實這題只需要根據題目敘述來對字元做操作而已。給定一個初始的字串後,按照題目的說明來更改字串中的字元,並將過程記錄在一個二維的陣列中,最後再依照敘述輸出答案即可。

解題過程

在前面字串的章節我們已經提過字串的原理了,字串本質上就是一個字元陣列,只是提供更豐富的功能而已。因此在這個題目中,我們會使用字串來對運算做優化,做成的一維字串陣列相當於一個二維的字元陣列。

決定好要解題的流程後,第一步當然是依照題意獲取資訊。

cin >> k >> q >> r;
cin >> s[0];

接著有 Q 次的修改,因此我們需要一個 for 迴圈來執行每一次的操作。而迴圈中很直觀的依照題目敘述,將舊的字元賦值給指定的位置。

for (int i = 1; i < q+1; i++) {
    s[i] = s[i-1];
    for (int j = 0; j < k; j++) {
        int p;
        cin >> p;
        s[i][p-1] = s[i-1][j];
    }
}

最後我們再根據題目的敘述,撰寫迴圈來將陣列中的值輸出。如果用一層迴圈來固定輸出第一個字元的話,可以獲得 60% 的分數;要獲得滿分的話,則需撰寫一個巢狀迴圈,來完整的依照題意輸出答案。

for (int i = 0; i < r; i++) {
    for (int j = 1; j < q+1; j++) {
        cout << s[j][i];
    }
    cout << "\n";
}

解題成果

#include <iostream>
#include <string>
using namespace std;

int k, q, r;
string s[21];

int main() {
    cin >> k >> q >> r;
    cin >> s[0];
    for (int i = 1; i < q+1; i++) {
        s[i] = s[i-1];
        for (int j = 0; j < k; j++) {
            int p;
            cin >> p;
            s[i][p-1] = s[i-1][j];
        }
    }
    for (int i = 0; i < r; i++) {
        for (int j = 1; j < q+1; j++) {
            cout << s[j][i];
        }
        cout << "\n";
    }
}