~cpp 
#include <iostream>
#include <cstring>
using namespace std;
struct Size
{
	int width;
	int height;
};
struct Location
{
	int x;
	int y;
};
class Journey
{
public:
	int *JourneyArray;
	int Length;
	int CurrentPosition;
	Journey(char *str)
	{
		Length=strlen(str);
		JourneyArray=new int[Length];
		for(int i=0;i<Length;i++)
			JourneyArray[i]=str[i]-'0';
		CurrentPosition=0;
	}
	~Journey()
	{
		delete[] JourneyArray;
	}
	int GetNextDirection()
	{
		if(IsFinished())
			return -1;
		return JourneyArray[CurrentPosition++];
	}
	bool IsFinished()
	{
		return (CurrentPosition==Length);
	}
};
class Board
{
public:
	int **BoardArray;
	Size BoardSize;
	int TraceCount;
	Board(Size size)
	{
		BoardSize = size;
		TraceCount = 0;
		
		BoardArray = new int* [size.height];
		for (int i = 0; i < size.height; i++)
		{
			BoardArray[i] = new int [size.width];
			for (int j = 0; j < size.width; j++)
				BoardArray[i][j] = 0;
		}
	}
	~Board()
	{
		for (int i = 0; i < BoardSize.height; i++)
			delete[] BoardArray[i];
		delete[] BoardArray;
	}
	void LeaveTrace(Location location)
	{
		BoardArray[location.y][location.x]++;
		TraceCount++;
	}
	bool IsAllCellsPassed()
	{
		for (int i = 0; i < BoardSize.height; i++)
		{
			for (int j = 0; j < BoardSize.width; j++)
			{
				if (BoardArray[i][j] == 0)
					return false;
			}
		}
		return true;
	}
};
class Roach
{
public:
	Board *MyBoard;
	Location CurrentLocation;
	void GoOnBoard(Board *board, Location startlocation)
	{
		MyBoard=board;
		CurrentLocation=startlocation;
		MyBoard->LeaveTrace(startlocation);
	}
	void Walk(Journey* journey)
	{
		int move[8][2]={ { 0, -1 }, { 1, -1 }, { 1, 0 }, { 1, 1 }, { 0, 1 }, { -1, 1 }, { -1, 0 }, { -1, -1 } };
		int direction;
		while(MyBoard->IsAllCellsPassed()==false || journey->IsFinished()==false)
		{
			direction=journey->GetNextDirection();
			CurrentLocation.x+=move[direction][0];
			CurrentLocation.y+=move[direction][1];
			if(CurrentLocation.x==-1) CurrentLocation.x=MyBoard->BoardSize.height-1;
			if(CurrentLocation.x==MyBoard->BoardSize.height) CurrentLocation.x=0;
			if(CurrentLocation.y==-1) CurrentLocation.y=MyBoard->BoardSize.width-1;
			if(CurrentLocation.y==MyBoard->BoardSize.width) CurrentLocation.y=0;
			MyBoard->LeaveTrace(CurrentLocation);
		}
	}
};
class User
{
public:
	Size GetBoardSize()
	{
		Size size;
		cin >> size.width >> size.height;
		return size;
	}
	Location GetRoachStartLocation()
	{
		Location location;
		cin >> location.x >> location.y;
		return location;
	}
	Journey * GetJourney()
	{
		char str[1024];
		cin >> str;
		return new Journey(str);
	}
	void PutBoard(Board *board)
	{
		cout << "움직인 횟수: " << board->TraceCount-1 <<endl;
		for (int h = 0; h < board->BoardSize.height; h++)
		{
			for (int w = 0; w < board->BoardSize.width; w++)
				cout << board->BoardArray[h][w] << " ";
			cout << endl;
		}
	}
};
class Executor
{
public:
	void Execute(User *user)
	{
		Size boardsize=user->GetBoardSize();
		Location startlocation=user->GetRoachStartLocation();
		Journey *journey=user->GetJourney();
		Board board(boardsize);
		Roach roach;
		roach.GoOnBoard(&board,startlocation);
		roach.Walk(journey);
		user->PutBoard(&board);
		delete journey;
	}
};
void main()
{
	Executor executor;
	User user;
	executor.Execute(&user);
}