#include<iostream>
using namespace std;
const int RIGHT=0;
const int DOWN=1;
const int LEFT=2;
const int UP=3;
const int DIRECTION=4;//�� 가능한 � 방향수
const int MOVE_X[DIRECTION]={1, 0, -1, 0};
const int MOVE_Y[DIRECTION]={0, 1, 0, -1};
const int MAX_X=5;
const int MAX_Y=5;
struct Mover
{
int currentX;//현재 x좌표
int currentY;//현재 y좌표
int currentDirection;//현재 �� 방향
Mover(int startingX, int startingY)
{//�성�
currentX=startingX;
currentY=startingY;
currentDirection=RIGHT;
}
};
void showBoard(int aBoard[][MAX_X]);//배열� 보여준다
void setEmptyBoard(int aBoard[][MAX_X]);//배열 초기화
void changeDirection(Mover * aMover);//방향� 바꾼다
int setStartingX();//시작 위치 ì„¤ì •: x
int setStartingY();//시작 위치 ì„¤ì •: y
void move(Mover * aMover);//��
bool isEnd(int endCount);//루프 ë��ë‚ ì§€ 검사
bool needToChangeDirection(Mover * aMover, int aBoard[][MAX_X]);//방향� 바꿀 필요가 있는지 검사
void checkAtBoard(int aBoard[][MAX_X], Mover * aMover, int * aNumber);//�� 결과를 배열� 표시
int main()
{
Mover mover(setStartingX(), setStartingY());//��하는 물체
int board[MAX_X][MAX_Y];//ë°°ì—´
int countMove=0;//� ��횟수
setEmptyBoard(board);//배열 초기화
checkAtBoard(board, &mover, &countMove);//첫 위치� 번호를 �어줌
do
{
if(needToChangeDirection(&mover, board))
changeDirection(&mover);//방향� 바꿀 필요가 있으면 바꿔줌
move(&mover);//��
checkAtBoard(board, &mover, &countMove);//배열� 표시
}while(isEnd(countMove));//종료조건
showBoard(board);//ê²°ê³¼ ì¶œë ¥
return 1;
}
void showBoard(int aBoard[][MAX_X])
{
for(int i=0;i<MAX_Y;i++)
{
for(int j=0;j<MAX_X;j++)
cout<<aBoard[i][j]<<"\t";
cout<<"\n";
}
}
void setEmptyBoard(int aBoard[][MAX_X])
{
for(int i=0;i<MAX_Y;i++)
{
for(int j=0;j<MAX_X;j++)
aBoard[i][j]=0;
}
}
void changeDirection(Mover * aMover)
{
if(aMover->currentDirection+1>UP)
aMover->currentDirection=RIGHT;
else
aMover->currentDirection+=1;
}
bool isEnd(int endCount)
{
if(endCount<MAX_X*MAX_Y)
return true;
else
return false;
}
int setStartingX()
{
int tempX;
cout<<"시작 ì �ì�˜ x좌표는?"<<endl;
cin>>tempX;
return tempX;
}
int setStartingY()
{
int tempY;
cout<<"시작 ì �ì�˜ y좌표는?"<<endl;
cin>>tempY;
return tempY;
}
void move(Mover * aMover)
{
aMover->currentX=aMover->currentX+MOVE_X[aMover->currentDirection];
aMover->currentY=aMover->currentY+MOVE_Y[aMover->currentDirection];
}
bool needToChangeDirection(Mover * aMover, int aBoard[][MAX_X])
{
if(aMover->currentX+MOVE_X[aMover->currentDirection]>=MAX_X)
return true;//X방향으로 ë°°ì—´ì�„ ë¹ ì ¸ë‚˜ê°ˆ 경우(MAXì�´ìƒ�)
if(aMover->currentY+MOVE_Y[aMover->currentDirection]>=MAX_Y)
return true;//Y방향으로 ë°°ì—´ì�„ ë¹ ì ¸ë‚˜ê°ˆ 경우(MAXì�´ìƒ�)
if(aMover->currentX+MOVE_X[aMover->currentDirection]<0)
return true;//X방향으로 ë°°ì—´ì�„ ë¹ ì ¸ë‚˜ê°ˆ 경우(0ì�´í•˜)
if(aMover->currentY+MOVE_Y[aMover->currentDirection]<0)
return true;//Y방향으로 ë°°ì—´ì�„ ë¹ ì ¸ë‚˜ê°ˆ 경우(0ì�´í•˜)
if(aBoard[aMover->currentY+MOVE_Y[aMover->currentDirection]][aMover->currentX+MOVE_X[aMover->currentDirection]]!=0)
return true;//ì�´ë�™í• 위치ì—� ì�´ë¯¸ ë”´ 숫ìž�ê°€ ì �혀 있는 경우
else
return false;
}
void checkAtBoard(int aBoard[][MAX_X], Mover * aMover, int * aNumber)
{
aBoard[aMover->currentY][aMover->currentX]=(*aNumber)+1;
(*aNumber)++;
}