题目:Triangle
来源:第二届太原理工大学程序设计新生赛决赛(重现赛)

解题思路

将三个 n-1 级的魔法阵放置在三个角上就可以得到 n 级魔法阵。
需要保证每行最后一个 \ 符号的左边除了 /\ 符号外,其它全部是 . 符号。
1 级魔法阵:

./\
/__\

使用递归或迭代。1 级魔法阵可以从以下二维数组中得出:

./\.
/__\

打印时,不打印前 n-1 行中后面的 .

C++代码

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

vector<vector<char>> draw(int n){
    if(n == 1){
        vector<vector<char>> triangle(2, vector<char>(4));
        triangle[0][0] = '.';
        triangle[0][1] = '/';
        triangle[0][2] = '\\';
        triangle[0][3] = '.';
        triangle[1][0] = '/';
        triangle[1][1] = '_';
        triangle[1][2] = '_';
        triangle[1][3] = '\\';
        return triangle;
    }
    vector<vector<char>> triangle = draw(n-1);
    int k = triangle.size();
    vector<vector<char>> ans(2*k, vector<char>(4*k, '.'));
    for(int i=0; i<k; ++i){
        for(int j=k; j<3*k; ++j)
            ans[i][j] = triangle[i][j-k];
    }
    for(int i=k; i<2*k; ++i){
        for(int j=0; j<2*k; ++j)
            ans[i][j] = triangle[i-k][j];
        for(int j=2*k; j<4*k; ++j)
            ans[i][j] = triangle[i-k][j-2*k];
    }
    return ans;
}

int main(){
    int n;
    cin >> n;
    vector<vector<char>> triangle = draw(n);
    int k = triangle.size();
    for(int i=0; i<k; ++i){
        for(int j=0; j<k+i+1; ++j)
            cout << triangle[i][j];
        cout << endl;
    }

    return 0;
}