~cpp 
#include <iostream>
#include <assert.h>
using namespace std;
typedef struct __IntPair {
	int n1;
	int n2;
} IntPair;
class Board
{
public:
	int m_nMaxCol;
	int m_nMaxRow;
	IntPair m_nRoachPos;
	Board () {
		for (int i=0;i<100;i++) {
			for (int j=0;j<100;j++) {
				boardArray[i][j] = 0;
			}
		}
	}
	
	int boardArray[100][100];
	void setSize (int nCol, int nRow) { 
		m_nMaxCol = nCol;
		m_nMaxRow = nRow;
	}
	void printBoardStatus () { 
		for (int i=0;i<m_nMaxRow;i++) {
			for (int j=0;j<m_nMaxCol;j++) {
				cout << boardArray[i][j] << " ";
			}
			cout <<endl;
		}
	}
	void updateCell () {  }
	
	int isCheckedAllCells () {return 0; }
	void setRoachPosition(int nRow, int nCol) {
		m_nRoachPos.n1 = nRow;
		m_nRoachPos.n2 = nCol;
	}
	IntPair getRoachPosition () {
		return m_nRoachPos;
	}
};
class Journey
{
public:
	int journeyArray[100];
	int nCurrentPosition;
	int journeySize;
	Journey (char* buffer) {
		journeySize = strlen(buffer);
		for (int i=0;i<journeySize;i++) {
			journeyArray[i] = buffer[i] - '0';
		}
		nCurrentPosition = -1;
	}
	~Journey () {   }
	int getNextJourney () {
		nCurrentPosition ++;
		if (journeySize <= nCurrentPosition) return -1;
		return journeyArray[nCurrentPosition];
	}
};
class Roach
{
public:
	Journey* m_pJourney;
	Board* m_pBoard;
	
	int m_nMoveCount;
	Roach () {
	}
	Roach (Journey* pJourney) { m_pJourney = pJourney; 
		m_nMoveCount=0;	
	}
	~Roach () {   }
	void goAboard (Board* pBoard, int nStartRow, int nStartCol) {
		m_pBoard = pBoard;
		m_pBoard->setRoachPosition(nStartRow, nStartCol);
	}
	void run () {
		while (!isFinished ()) {
			move (m_pJourney->getNextJourney ());
		}
	}
	void move (int nLocation) {
	}
	
	int isFinished () {
		return 1;
	}
	void printMoveCount () {
		cout << "move count : " << m_nMoveCount << endl;
	}
};
class Inputer
{
public:
	int m_nBoardCol;
	int m_nBoardRow;
	int m_nStartCol;
	int m_nStartRow;
	Journey* journey;
	void getData () {
		cin >> m_nBoardRow >> m_nBoardCol;
		cin >> m_nStartRow >> m_nStartCol;
		char buffer[100];
		scanf ("%s", buffer);
	}
	int getBoardCol () { return m_nBoardRow; }
	int getBoardRow () { return m_nBoardCol; }
	int getStartCol () { return 0; }
	int getStartRow () { return 0; }
	Journey* getJourney () { return journey; }
};
class Game
{
public:
	Inputer* inputer; 
	Board board;
	Roach* roach;
	Game () {   }
	~Game () {   }
	void setInputer (Inputer* pInputer) {
		inputer = pInputer;
	}
	void start () {
		roach = new Roach (inputer->getJourney ());
		board.setSize (inputer->getBoardRow (), inputer->getBoardCol ());
		roach->goAboard (&board, inputer->getStartRow(), inputer->getStartCol());
		roach->run ();
		roach->printMoveCount ();
		board.printBoardStatus ();
	}
};
void testJourney () {
	char buffer[100] = "112";
	Journey* journey = new Journey(buffer);
	int actual; 
	int expectedSet[5] = {1,1,2,-1,-1};
	for (int i=0;i<5;i++) {
		actual = journey->getNextJourney();
		assert (actual == expectedSet[i]);
	}
	cout << "Journey.getNextJourney() Ok \n";
}
void testRoach () {
	Board board;
	board.setSize(5,5);
	Roach roach;
	roach.goAboard(&board, 1, 2);
	assert (board.getRoachPosition ().n1 == 1);
	assert (board.getRoachPosition ().n2 == 2);
	cout << "Roach.goAboard () Ok \n";
}
int main ()
{
	/*
	Game game;
	Inputer inputer;
	inputer.getData();
	game.setInputer (&inputer);
	game.start ();
	*/
	testJourney();
	testRoach();
	return 0;
}