https://vjudge.net/problem/HihoCoder-1632
北京这题真的是 模拟到爆炸

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 1e3 + 5;

char mp[maxn][maxn];
char id[maxn * maxn];
char ans[maxn][maxn];
int n, m;

bool vis[maxn][maxn];
int tot = 0;
void dfs(int x, int y, int op, int f) {
 // cout << x << " " << y << " " << op << endl;
    id[++tot] = mp[x][y];
    if(x == n && y == n)
        return ;
    if(op == 0) {
        if(!f) {
            if(y == n)
                dfs(x + 1, y, 3, 1);
            else
                dfs(x, y + 1, 0, 1);
        } else {
            if(x == 1) dfs(x + 1, y - 1, 1, 1);
            if(x == n) dfs(x - 1, y + 1, 2, 1);
        }
    }
    if(op == 1) {
        if(x == n) dfs(x, y + 1, 0, 1);
        else  if(y == 1) dfs(x + 1, y, 3, 1);
        else dfs(x + 1, y - 1, 1, 0);
    }
    if(op == 2) {
        if(y == n) dfs(x + 1, y, 3, 1);
        else if(x == 1) dfs(x, y + 1, 0, 1);
        else dfs(x - 1, y + 1, 2, 0);
    }
    if(op == 3) {
        if(y == 1) dfs(x - 1, y + 1, 2, 0);
        if(y == n) dfs(x + 1, y - 1, 1, 0);
    }
}

void dfs2(int x, int y, int cnt, int op) {
    ans[x][y] = id[cnt];
    vis[x][y] = 1 ;
    if(cnt != n * n) {
        if(op == 0) {
            if(y + 1 <= n && !vis[x][y + 1])
                dfs2(x, y + 1, cnt + 1, 0);
            else
                dfs2(x + 1, y, cnt + 1, 1);
        }
        if(op == 1) {
            if(x + 1 <= n && !vis[x + 1][y])
                dfs2(x + 1, y, cnt + 1, 1);
            else
                dfs2(x, y - 1, cnt + 1, 2);
        }
        if(op == 2) {
            if(y - 1 >= 1 && !vis[x][y - 1])
                dfs2(x, y - 1, cnt + 1, 2);
            else
                dfs2(x - 1, y, cnt + 1, 3);
        }
        if(op == 3) {
            if(x - 1 >= 1 && !vis[x - 1][y])
                dfs2(x - 1, y, cnt  + 1, 3);
            else
                dfs2(x, y + 1, cnt + 1, 0);
        }
    }
}

int main() {
    while(scanf("%d", &n) != EOF) {
        tot = 0;
        memset(vis, 0, sizeof(vis));
        for(int i = 1; i <= n; i ++)
            scanf("%s", mp[i] + 1);
        dfs(1, 1, 0, 0);
        dfs2(1, 1, 1, 0);
        for(int i = 1; i <= n; i ++) {
            for(int j = 1; j <= n; j++) {
                printf("%c", ans[i][j]);
            }
            puts("");
        }
    }
    return 0;
}