未必是最快的,但或许是最简洁的。

灵感:如果我拿着一张世界地图在地球上行走,那地图上一定有一个点,就代表它本身。

注意到,我们只要找到不动点即可:

1)如果一个点在粗粒度已经落在了“空白区”,直接输出空格即可。

2)只有不断细分,直到最小尺度仍不是空白,才输出相应的符号。

#include <stdio.h>
#include <math.h>

int main() {
    int n, i, j, lev;
    char t, temp[7][7];
    while (scanf("%d", &n)&&n!=0) {
        //input
        getchar();
        for (i = 0; i < n; ++i) {
            fgets(temp[i], sizeof(temp[i]), stdin);
            // for (j = 0; j < n; ++j) {
            //     if(temp[i][j]=='\n'||temp[i][j]=='\0') temp[i][j]=' ';
            // } 默认测试样例丢空格,实际测试样例是方的
        }
        scanf("%d", &lev);
        getchar();

        //output
        int si=pow(n, lev), ti, tj, tl;
        for (i = 0; i < si; ++i) {
            for (j = 0; j < si; ++j) {
                ti=i; tj=j; tl=lev-1;
                int flag=1;
                while(tl>0){
                        int tag=pow(n, tl--);
                        if(temp[ti/tag][tj/tag]==' '){
                            flag=0; break;
                        }else{
                            ti = ti%tag; tj = tj%tag;
                        }
                }
                printf("%c", flag ? temp[ti][tj]:' ');
            }
            printf("\n");
        }
    }
    return 0;
}