#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)++; }