分层求每个元素映射到模板的位置

#include <iostream>
#include <cstring>

using namespace std;

char mod[5][5], ch;
int n, q, sz;

// a的k次方(cmath的pow是浮点运算)
int pow(int a, int k) {
    int res = 1;
    while (k--) res *= a;
    return res;
}

int main() {
    while (cin >> n, n != 0) {

        cin.ignore(); // 丢掉 '\n'
        for (int i = 0; i < n; i++) {
            cin.getline(mod[i], 6);

            // 获取非空字符
            for (int j = 0; j < n; j++)  
                if (mod[i][j] != ' ') 
                    ch = mod[i][j];
        }

        cin >> q;
        sz = pow(n, q);

        // 每个元素映射到模板的位置
        for (int i = 0; i < sz; i++) {
            for (int j = 0; j < sz; j++) {
                
                bool ok = true;
                int x = i, y = j;

                // 层数由大到小分析
                for (int k = q - 1; k >= 0; k--) {
                    
                    // 本层块的大小
                    int lsz = pow(n, k);

                    // 计算 (x, y) 映射到模板的哪一块
                    if (mod[x / lsz][y / lsz] == ' ') {
                        // 映射到空块可直接退出
                        ok = false;
                        break;
                    }

                    // 计算下一层的坐标
                    x %= lsz;
                    y %= lsz;
                }

                cout << (ok ? ch : ' ');
            }
            cout << endl;
        }
    }
    return 0;
}