Language: C++

#include <iostream>
#include <cstdlib>


// 2, 3, 5, 4, 1, 6
class BiasedDice
{
private:
	enum { N = 29, NOF = 6, NOW = 4 };	// N: table size, NOF: num of face, NOW: num of way
	int blocks[N][N];	// block table
	int heights[N][N];	// height table
	
	// dice table
	static const int dice[NOF][NOF];
	// rotation
	static const int rotation[NOW][NOF];
	// 隣接点
	static const struct Next{int x, y;} d[NOW];
	
	int current[NOF];
	int x, y;
public:
	BiasedDice()
	{
		memset(blocks, 0, sizeof(blocks));
		memset(heights, 0, sizeof(heights));
		initPos();
	}
	// テーブルポジションをイニシャライズ
	void initPos() { x = y = N / 2; }
	// カレントダイス設定 t:上面 f:正面
	void setCurrent(int t, int f);
	// ダイス追加
	void putDice(int t, int f);
	// 回転処理 n: SWNE 0123
	void rotate(int n);
	// 結果表示
	void showResult();
	
};

// dice table
const int BiasedDice::dice[BiasedDice::NOF][BiasedDice::NOF] = {
	{2, 4, 5, 3, 6, 1},
	{2, 3, 5, 4, 1, 6},
	{1, 4, 6, 3, 2, 5},
	{1, 2, 6, 5, 3, 4},
	{1, 5, 6, 2, 4, 3},
	{1, 3, 6, 4, 5, 2}
};
// rotation
const int BiasedDice::rotation[BiasedDice::NOW][BiasedDice::NOF] = {
	{4, 1, 5, 3, 2, 0},
	{0, 4, 2, 5, 3, 1},
	{5, 1, 4, 3, 0, 2},
	{0, 5, 2, 4, 1, 3}
};
const struct BiasedDice::Next BiasedDice::d[BiasedDice::NOW] = {
	{0, 1},
	{1, 0},
	{0, -1},
	{-1, 0}
};
// カレントダイス設定 t:上面 f:正面
void BiasedDice::setCurrent(int t, int f)
{
	t %= NOF;
	memcpy(current, dice[t], sizeof(current));
	for (int k = 0; current[0] != f; ++k) {
		for (int i = 0; i < 4; ++i) {
			current[i] = dice[t][(i + k) % 4];
		}
	}
}
// ダイス追加
void BiasedDice::putDice(int t, int f)
{
	initPos();
	setCurrent(t, f);
	
	while (heights[x][y] != 0) {
		int i;
		for (i = NOF; i > 3; --i) {
			int j;
			for (j = 0; j < 4; ++j) if (current[j] == i) break;
			if (j < 4 && heights[x + d[j].x][y + d[j].y] < heights[x][y]) {
				rotate(j);
				break;
			}
		}
		if (i == 3) break;
	}
	++heights[x][y];
	blocks[x][y] = current[4];
}
// 回転処理 n: SENW 0123
void BiasedDice::rotate(int n)
{
	int temp[NOF];
	memcpy(temp, current, sizeof(current));
	for (int i = 0; i < NOF; ++i) {
		current[i] = temp[rotation[n][i]];
	}
	x += d[n].x;
	y += d[n].y;
}
// 結果表示
void BiasedDice::showResult()
{
	int result[7] = {0};
	for (int i = 0; i < N; ++i) {
		for (int j = 0; j < N; ++j) {
			++result[blocks[i][j]];
		}
		std::cout << std::endl;
	}
	for (int i = 1; i < NOF; ++i) {
		std::cout << result[i] << ' ';
	}
	std::cout << result[NOF] << std::endl;
}

int main()
{
	int n;
	while (std::cin >> n, n) {
		BiasedDice dice;
		while (n--) {
			int t, f;
			std::cin >> t >> f;
			dice.putDice(t, f);
		}
		dice.showResult();
	}
	
	return 0;
}

Compiler output:
a.cc: In constructor 'BiasedDice::BiasedDice()':
a.cc:25:17: error: 'memset' was not declared in this scope
   25 |                 memset(blocks, 0, sizeof(blocks));
      |                 ^~~~~~
a.cc:3:1: note: 'memset' is defined in header '<cstring>'; this is probably fixable by adding '#include <cstring>'
    2 | #include <cstdlib>
  +++ |+#include <cstring>
    3 | 
a.cc: In member function 'void BiasedDice::setCurrent(int, int)':
a.cc:68:9: error: 'memcpy' was not declared in this scope
   68 |         memcpy(current, dice[t], sizeof(current));
      |         ^~~~~~
a.cc:68:9: note: 'memcpy' is defined in header '<cstring>'; this is probably fixable by adding '#include <cstring>'
a.cc: In member function 'void BiasedDice::rotate(int)':
a.cc:100:9: error: 'memcpy' was not declared in this scope
  100 |         memcpy(temp, current, sizeof(current));
      |         ^~~~~~
a.cc:100:9: note: 'memcpy' is defined in header '<cstring>'; this is probably fixable by adding '#include <cstring>'