zoj 3507 Fractal


直接再帰すればいいです.stringで各行を記録すればいいです.最初は多すぎて覚えられないと思っていましたが、実はいいです.
各行をメモしないと、末尾のスペースを処理するのは難しいです.
/*
 * Author: stormdpzh
 * Created Time: 2012/7/16 13:22:56
 * File Name: h.cpp
 */
#include <iostream>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <string>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <algorithm>
#include <functional>

#define sz(v) ((int)(v).size())
#define rep(i, n) for(int i = 0; i < n; i++)
#define repf(i, a, b) for(int i = a; i <= b; i++)
#define repd(i, a, b) for(int i = a; i >= b; i--)
#define out(n) printf("%d
", n) #define mset(a, b) memset(a, b, sizeof(a)) #define wh(n) while(1 == scanf("%d", &n)) #define whz(n) while(1 == scanf("%d", &n) && n != 0) #define lint long long using namespace std; const int MaxN = 13; char mp[MaxN][MaxN]; int m, n; lint boss; int ff; string str; lint mypow(int m, int f) { lint res = 1; for(int i = 0; i < f; i++) res *= (lint)m; return res; } void gao(int f, lint id) { if(1 == f) { for(int i = 0; i < n; i++) { str += mp[(int)id][i]; } return ; } lint mm = mypow(m, f); lint mmm = mypow(m, f - 1); lint nn = mypow(n, f - 1); for(int j = 0; j < n; j++) { if(mp[int(id / mmm)][j] == ' ') { for(lint k = 0; k < nn; k++) str += " "; } else { gao(f - 1, id % mmm); } } } int main() { //freopen("h.out", "w", stdout); int ans = 1; while(2 == scanf("%d%d", &m, &n)) { if(ans > 1) printf("
"); rep(i, m) rep(j, n) { char ch; while(scanf("%c", &ch)) { if(ch != '
') break; } mp[i][j] = ch; } scanf("%d", &ff); lint mm = mypow(m, ff); printf("Fractal #%d:
", ans++); for(lint i = 0; i < mm; i++) { str = ""; gao(ff, i); int len = sz(str); while(str[len - 1] == ' ') len--; rep(i, len) printf("%c", str[i]); printf("
"); } } return 0; }