Problem p02825 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <vector>

using namespace std;
typedef long long ll;

char ans[1000][1000];

vector<vector<char>> b3 = {{'.', 'a', 'a'}, {'b', '.', '.'}, {'b', '.', '.'}};

vector<vector<char>> b4 = {{'a', 'a', 'c', 'd'},
                           {'b', 'b', 'c', 'd'},
                           {'c', 'd', 'b', 'b'},
                           {'c', 'd', 'a', 'a'}};

vector<vector<char>> b5 = {
    {'a', 'b', 'b', 'c', 'c'}, {'a', 'c', 'c', '.', 'b'},
    {'b', '.', '.', 'c', 'b'}, {'b', '.', '.', 'c', 'a'},
    {'a', 'a', 'b', 'b', 'a'},
};

vector<vector<char>> b7 = {
    {'a', '.', 'b', '.', '.', 'c', 'c'}, {'a', '.', 'b', 'c', 'c', '.', '.'},
    {'.', 'b', 'a', 'a', '.', 'c', 'c'}, {'.', 'b', '.', '.', 'a', 'b', '.'},
    {'a', 'a', '.', '.', 'a', 'b', '.'}, {'.', '.', 'a', 'a', 'c', '.', 'c'},
    {'a', 'a', '.', '.', 'c', '.', 'c'}};

vector<int> find(int n) {
  vector<int> ans;
  if (n % 3 == 0) {
    for (int i = 0; i < n / 3; i++)
      ans.push_back(3);
  } else if (n % 4 == 0) {
    for (int i = 0; i < n / 4; i++)
      ans.push_back(4);
  } else {
    for (int i = 0; i < n / 4; i++) {
      int rem = n - i * 4;
      if (rem % 5 == 0) {
        for (int j = 0; j < i; j++)
          ans.push_back(4);
        for (int j = 0; j < rem / 5; j++)
          ans.push_back(5);
        break;
      }
      if (rem % 7 == 0) {
        for (int j = 0; j < i; j++)
          ans.push_back(4);
        for (int j = 0; j < rem / 7; j++)
          ans.push_back(7);
        break;
      }
    }
    if (ans.size() == 0) {
      for (int i = 0; i < n / 5; i++) {
        int rem = n - i * 5;
        if (rem % 7 == 0) {
          for (int j = 0; j < i; j++)
            ans.push_back(5);
          for (int j = 0; j < rem / 7; j++)
            ans.push_back(7);
          break;
        }
      }
    }
  }
  return ans;
}

vector<vector<char>> buf[10];

void create(vector<int> v) {
  int cur = 0;
  for (int i = 0; i < v.size(); i++) {
    for (int j = 0; j < buf[v[i]].size(); j++) {
      for (int k = 0; k < buf[v[i]].size(); k++) {
        ans[cur + j][cur + k] = buf[v[i]][j][k];
      }
    }
    cur += buf[v[i]].size();
  }
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout << setprecision(10) << fixed;
  buf[3] = b3;
  buf[4] = b4;
  buf[5] = b5;
  buf[7] = b7;
  int N;
  cin >> N;
  for (int i = 0; i < N; i++) {
    for (int j = 0; j < N; j++) {
      ans[i][j] = '.';
    }
  }
  if (N == 2) {
    cout << -1 << endl;
    return -1;
  }
  vector<int> v = find(N);
  create(v);
  for (int i = 0; i < N; i++) {
    for (int j = 0; j < N; j++) {
      cout << ans[i][j];
    }
    cout << endl;
  }
}

Fixed submission:
#include <algorithm>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <vector>

using namespace std;
typedef long long ll;

char ans[1000][1000];

vector<vector<char>> b3 = {{'.', 'a', 'a'}, {'b', '.', '.'}, {'b', '.', '.'}};

vector<vector<char>> b4 = {{'a', 'a', 'c', 'd'},
                           {'b', 'b', 'c', 'd'},
                           {'c', 'd', 'b', 'b'},
                           {'c', 'd', 'a', 'a'}};

vector<vector<char>> b5 = {
    {'a', 'b', 'b', 'c', 'c'}, {'a', 'c', 'c', '.', 'b'},
    {'b', '.', '.', 'c', 'b'}, {'b', '.', '.', 'c', 'a'},
    {'a', 'a', 'b', 'b', 'a'},
};

vector<vector<char>> b7 = {
    {'a', '.', 'b', '.', '.', 'c', 'c'}, {'a', '.', 'b', 'c', 'c', '.', '.'},
    {'.', 'b', 'a', 'a', '.', 'c', 'c'}, {'.', 'b', '.', '.', 'a', 'b', '.'},
    {'a', 'a', '.', '.', 'a', 'b', '.'}, {'.', '.', 'a', 'a', 'c', '.', 'c'},
    {'a', 'a', '.', '.', 'c', '.', 'c'}};

vector<int> find(int n) {
  vector<int> ans;
  if (n % 3 == 0) {
    for (int i = 0; i < n / 3; i++)
      ans.push_back(3);
  } else if (n % 4 == 0) {
    for (int i = 0; i < n / 4; i++)
      ans.push_back(4);
  } else {
    for (int i = 0; i < n / 4; i++) {
      int rem = n - i * 4;
      if (rem % 5 == 0) {
        for (int j = 0; j < i; j++)
          ans.push_back(4);
        for (int j = 0; j < rem / 5; j++)
          ans.push_back(5);
        break;
      }
      if (rem % 7 == 0) {
        for (int j = 0; j < i; j++)
          ans.push_back(4);
        for (int j = 0; j < rem / 7; j++)
          ans.push_back(7);
        break;
      }
    }
    if (ans.size() == 0) {
      for (int i = 0; i < n / 5; i++) {
        int rem = n - i * 5;
        if (rem % 7 == 0) {
          for (int j = 0; j < i; j++)
            ans.push_back(5);
          for (int j = 0; j < rem / 7; j++)
            ans.push_back(7);
          break;
        }
      }
    }
  }
  return ans;
}

vector<vector<char>> buf[10];

void create(vector<int> v) {
  int cur = 0;
  for (int i = 0; i < v.size(); i++) {
    for (int j = 0; j < buf[v[i]].size(); j++) {
      for (int k = 0; k < buf[v[i]].size(); k++) {
        ans[cur + j][cur + k] = buf[v[i]][j][k];
      }
    }
    cur += buf[v[i]].size();
  }
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout << setprecision(10) << fixed;
  buf[3] = b3;
  buf[4] = b4;
  buf[5] = b5;
  buf[7] = b7;
  int N;
  cin >> N;
  for (int i = 0; i < N; i++) {
    for (int j = 0; j < N; j++) {
      ans[i][j] = '.';
    }
  }
  if (N == 2) {
    cout << -1 << endl;
    return 0;
  }
  vector<int> v = find(N);
  create(v);
  for (int i = 0; i < N; i++) {
    for (int j = 0; j < N; j++) {
      cout << ans[i][j];
    }
    cout << endl;
  }
}