U E D R , A S I H C RSS

Random Walk2/상규

프로그램 소스

~cpp 
#include <iostream>
#include <cstring>
using namespace std;

#define MAX_JOURNEY 1024	// 최대 여정 수

int walk(int m, int n, int starti, int startj, char journey[MAX_JOURNEY], int **board);

// 메인 함수
void main()
{
	// 입력 데이터
	int m, n;
	int starti, startj;
	char journey[MAX_JOURNEY];

	// 입력
	cout << "Input :\n";
	cin >> m >> n;
	cin >> starti >> startj;

	// 여정 입력
	char buffer[MAX_JOURNEY];
	int offset=0;
	for(;;)
	{
		cin.getline(buffer,MAX_JOURNEY);
		if(strcmp(buffer,"999")==0)
			break;

		strcpy(&journey[offset],buffer);
		offset+=strlen(buffer);
	}

	// 출력 데이터
	int count;
	int **board=new int*[m];
	for(int i=0;i<m;i++)
	{
		board[i]=new int[n];

		for(int j=0;j<n;j++)
			board[i][j]=0;
	}

	// Walk
	count=walk(m,n,starti,startj,journey,board);

	// 출력
	cout << "Output :\n";
	cout << count << endl;
	for(i=0;i<m;i++)
	{
		for(int j=0;j<n;j++)
			cout << board[i][j] << " ";
		cout << endl;
	}

	for(i=0;i<m;i++)
		delete[] board[i];
	delete[] board;
}

// Walk 하는 함수
int walk(int m, int n, int starti, int startj, char journey[MAX_JOURNEY], int **board)
{
	int move[8][2]={ { -1, 0 }, { -1, 1 }, { 0, 1 }, { 1, 1 },
					{ 1, 0 }, { 1, -1 }, { 0, -1 }, { -1, -1 } };

	int count=0;
	board[starti][startj]=1;

	int currenti=starti, currentj=startj;
	int journeycount=0;
	for(;;)
	{
		// 종료 조건 검사
		bool quit=true;
		for(int i=0;i<m;i++)
		{
			for(int j=0;j<n;j++)
			{
				if(board[i][j]==0)
					quit=false;
			}
			if(quit==false)
				break;
		}
		if(quit==true || journey[journeycount]=='\0')
			break;

		// Walk
		currenti+=move[journey[journeycount]-'0'][0];
		currentj+=move[journey[journeycount]-'0'][1];
		journeycount++;

		if(currenti==-1) currenti=m-1;
		if(currenti==m) currenti=0;
		if(currentj==-1) currentj=n-1;
		if(currentj==n) currentj=0;

		board[currenti][currentj]++;
		count++;
	}

	return count;
}
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:27:50
Processing time 0.0139 sec