Problem p03222 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;

long mod = 1000000007;
long dp[101][8] = {};
int H, W;
vector<vector<int>> v; // 横棒のパターン
int bit[8] = {};

void addBit() {
  int l = W - 1;
  for (int i = 1; i < l; i++) {
    if (bit[i - 1] == 1 && bit[i] == 1)
      return;
  }
  vector<int> tmp(l);
  for (int i = 0; i < l; i++) {
    tmp[i] = bit[i];
  }
  v.push_back(tmp);
}

void makeBit(int k) {
  if (k == W - 1) {
    addBit();
    return;
  }
  makeBit(k + 1);
  bit[k] = 1;
  makeBit(k + 1);
  bit[k] = 0;
}

void swap(long a[], vector<int> b, long c[]) {
  for (int i = 0; i < W - 1; i++) {
    if (b[i] == 1) {
      c[i] = a[i + 1];
      c[i + 1] = a[i];
    }
  }
}

void disp(long a[]) {
  for (int i = 0; i < W; i++) {
    cout << a[i] << " ";
  }
  cout << "\n";
}
int main() {
  // cin.tie(0);
  // ios::sync_with_stdio(false);
  int K;
  cin >> H >> W >> K;

  if (W == 1) {
    if (K == 1)
      cout << "1\n";
    else
      cout << "0\n";
    return 0;
  }

  dp[0][0] = 1;
  makeBit(0);
  // for (int i = 0; i < v.size(); i++) {
  //   for(int j = 0; j < W - 1; j++) {
  //     cout << v[i][j] << " ";
  //   }
  //   cout << "\n";
  // }
  int l = v.size();
  for (int i = 1; i <= H; i++) {
    for (int j = 0; j < l; j++) {
      long *c = new long[W]();
      memcpy(c, dp[i - 1], sizeof(dp[i - 1]));
      // disp(c);
      // disp(dp[i - 1]);
      swap(dp[i - 1], v[j], c);
      // disp(c);
      for (int k = 0; k < W; k++) {
        dp[i][k] += c[k];
        dp[i][k] %= mod;
      }
    }
  }
  cout << dp[H][K - 1] << "\n";
  return 0;
}

Fixed submission:
#include <bits/stdc++.h>
using namespace std;

long mod = 1000000007;
long dp[101][8] = {};
int H, W;
vector<vector<int>> v; // 横棒のパターン
int bit[8] = {};

void addBit() {
  int l = W - 1;
  for (int i = 1; i < l; i++) {
    if (bit[i - 1] == 1 && bit[i] == 1)
      return;
  }
  vector<int> tmp(l);
  for (int i = 0; i < l; i++) {
    tmp[i] = bit[i];
  }
  v.push_back(tmp);
}

void makeBit(int k) {
  if (k == W - 1) {
    addBit();
    return;
  }
  makeBit(k + 1);
  bit[k] = 1;
  makeBit(k + 1);
  bit[k] = 0;
}

void swap(long a[], vector<int> b, long c[]) {
  for (int i = 0; i < W - 1; i++) {
    if (b[i] == 1) {
      c[i] = a[i + 1];
      c[i + 1] = a[i];
    }
  }
}

void disp(long a[]) {
  for (int i = 0; i < W; i++) {
    cout << a[i] << " ";
  }
  cout << "\n";
}
int main() {
  // cin.tie(0);
  // ios::sync_with_stdio(false);
  int K;
  cin >> H >> W >> K;

  if (W == 1) {
    if (K == 1)
      cout << "1\n";
    else
      cout << "0\n";
    return 0;
  }

  dp[0][0] = 1;
  makeBit(0);
  // for (int i = 0; i < v.size(); i++) {
  //   for(int j = 0; j < W - 1; j++) {
  //     cout << v[i][j] << " ";
  //   }
  //   cout << "\n";
  // }
  int l = v.size();
  for (int i = 1; i <= H; i++) {
    for (int j = 0; j < l; j++) {
      long *c = new long[W]();
      for (int k = 0; k < W; k++) {
        c[k] = dp[i - 1][k];
      }
      // memcpy(c, dp[i - 1], sizeof(dp[i - 1]));
      // disp(c);
      // disp(dp[i - 1]);
      swap(dp[i - 1], v[j], c);
      // disp(c);
      for (int k = 0; k < W; k++) {
        dp[i][k] += c[k];
        dp[i][k] %= mod;
      }
    }
  }
  cout << dp[H][K - 1] << "\n";
  return 0;
}