Problem p00141 (C++) — buggy submission, verdict: Runtime Error

#include <algorithm>
#include <bitset>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> i_i;
typedef pair<long long, int> ll_i;

#define PI 3.141592653589793238462643383279
#define mod 1000000007LL
#define rep(i, n) for (i = 0; i < n; ++i)
#define rep1(i, n) for (i = 1; i < n; ++i)
#define per(i, n) for (i = n - 1; i > -1; --i)
#define int(x)                                                                 \\
  int x;                                                                       \\
  scanf("%d", &x)
#define int2(x, y)                                                             \\
  int x, y;                                                                    \\
  scanf("%d%d", &x, &y)
#define int3(x, y, z)                                                          \\
  int x, y, z;                                                                 \\
  scanf("%d%d%d", &x, &y, &z)
#define int4(v, x, y, z)                                                       \\
  int v, x, y, z;                                                              \\
  scanf("%d%d%d%d", &v, &x, &y, &z)
#define int5(v, w, x, y, z)                                                    \\
  int v, w, x, y, z;                                                           \\
  scanf("%d%d%d%d%d", &v, &w, &x, &y, &z)
#define pri(x) cout << (x) << "\\n"
#define pri2(x, y) cout << (x) << " " << (y) << "\\n"
#define pri3(x, y, z) cout << (x) << " " << (y) << " " << (z) << "\\n"
#define pb push_back
#define mp make_pair
#define all(a) (a).begin(), (a).end()
#define kabe puts("---------------------------")
#define kara puts("")
#define debug(x) cout << " --- " << (x) << "\\n"
#define debug2(x, y) cout << " --- " << (x) << " " << (y) << "\\n"
#define debug3(x, y, z)                                                        \\
  cout << " --- " << (x) << " " << (y) << " " << (z) << "\\n"
#define X first
#define Y second
#define eps 0.0001
#define prid(x) printf("%.15lf\\n", x)

char f[100][100];
int dw[4] = {0, 1, 0, -1};
int dh[4] = {-1, 0, 1, 0};
signed main(void) {
  int i, j;
  int(d);
  for (int testcase = 0; testcase < d; testcase++) {
    if (testcase != 0)
      puts("");
    int(n);
    rep(i, n) rep(j, n) f[i][j] = ' ';
    int noww = 0, nowh = n - 1, k = 0;

    bool is = false;
    for (;;) {
      // printf("%d %d %d\\n", nowh, noww, k);
      f[nowh][noww] = '#';
      if (0 > nowh + dh[k] || nowh + dh[k] >= n || 0 > noww + dw[k] ||
          noww + dw[k] >= n) {
        // puts("a");
        if (is)
          break;
        is = true;
        k = (k + 1) % 4;
        continue;
      }
      if (0 <= nowh + dh[k] * 2 && nowh + dh[k] * 2 < n)
        if (0 <= noww + dw[k] * 2 && noww + dw[k] * 2 < n)
          if (f[nowh + dh[k] + dh[k]][noww + dw[k] + dw[k]] == '#') {
            // puts("b");
            if (is)
              break;
            is = true;
            k = (k + 1) % 4;
            continue;
          }
      if (0 <= nowh + dh[k] + dh[(k + 1) % 4] &&
          nowh + dh[k] + dh[(k + 1) % 4] < n)
        if (0 <= noww + dw[k] + dw[(k + 1) % 4] &&
            noww + dw[k] + dw[(k + 1) % 4] < n)
          if (f[nowh + dh[k] + dh[(k + 1) % 4]]
               [noww + dw[k] + dw[(k + 1) % 4]] == '#') {
            // puts("c");
            if (is)
              break;
            is = true;
            k = (k + 1) % 4;
            continue;
          }
      if (0 <= nowh + dh[(k + 3) % 4] && nowh + dh[(k + 3) % 4] < n)
        if (0 <= noww + dw[(k + 3) % 4] && noww + dw[(k + 3) % 4] < n)
          if (f[nowh + dh[(k + 3) % 4]][noww + dw[(k + 3) % 4]] == '#') {
            // puts("d");
            if (is)
              break;
            is = true;
            k = (k + 1) % 4;
            continue;
          }
      // puts("e");
      is = false;
      nowh += dh[k];
      noww += dw[k];
    }

    rep(i, n) {
      rep(j, n) printf("%c", f[i][j]);
      puts("");
    }

    //*/

    //*/ break;
  }
  return 0;
}

Error: WA

Fixed submission:

#include <algorithm>
#include <cstdio>
#include <iostream>
using namespace std;

#define rep(i, n) for ((i) = 0; (i) < (n); ++(i))

char f[100][100];
int dh[4] = {-1, 0, 1, 0};
int dw[4] = {0, 1, 0, -1};
int main(void) {
  int d, n, i, j;
  scanf("%d", &d);
  for (; d--;) {
    scanf("%d", &n);
    rep(i, n) rep(j, n) {
      f[i][j] = ' ';
      if (i == 0 || j == 0 || i == n - 1 || j == n - 1)
        f[i][j] = '#';
    }

    int w = 2, h = n - 1, k = 0;
    f[h][w - 1] = ' ';
    if (n >= 4)
      for (int times = 200000; times--;) {
        // printf("%d %d\\n", h, w);
        f[h][w] = '#';
        if (f[h + dh[k] + dh[k]][w + dw[k] + dw[k]] == '#')
          k = (k + 1) % 4;
        else if (f[h + dh[k] + dh[(k + 1) % 4]][w + dw[k] + dw[(k + 1) % 4]] ==
                 '#')
          k = (k + 1) % 4;
        else if (f[h + dh[k] + dh[(k + 3) % 4]][w + dw[k] + dw[(k + 3) % 4]] ==
                 '#')
          k = (k + 1) % 4;
        else {
          h += dh[k];
          w += dw[k];
        }
      }

    rep(i, n) {
      rep(j, n) printf("%c", f[i][j]);
      puts("");
    }
    if (d >= 0)
      puts("");
  }
  return 0;
}