🙇‍♀️달팽이 연습문제

콘솔 창에 5를 입력하면

01 02 03 04 05
16 17 18 19 06
15 24 25 20 07
14 23 22 21 08
13 12 11 10 09

위와 같이 출력하는 프로그램을 만들기


🪐달팽이 연습문제

#include <iostream>
using namespace std;
#include <iomanip>

const int MAX = 100;
int board[MAX][MAX] = {};
int N;

void PrintBoard()
{
	for (int y = 0; y < N; y++)
	{
		for (int x = 0; x < N; x++)
		{
			cout << setfill('0') << setw(3) << board[y][x] << " ";
		}
		cout << endl;
	}
}

enum DIR
{
	RIGHT = 0,
	DOWN = 1,
	LEFT = 2,
	UP = 3,
};

bool CanGo(int y, int x)
{
	if (y < 0 || y >= N)return false;
	if (x < 0 || x >= N)return false;
	if (board[y][x] != 0)return false;
	return true;
}

void SetBoard()
{
	// 01 02 03 04 05
	//  ...
	// 13 12 11 10 09

	// 05 04 04 03 

	int dir = RIGHT;

	int y = 0, x = 0;
	int num = 1;
	while (true)
	{
		board[y][x] = num;
		if (num == N * N) break;

		int nextX;
		int nextY;

		switch (dir)
		{
		case RIGHT:
			nextY = y;
			nextX = x + 1;
			break;
		case DOWN:
			nextY = y + 1;
			nextX = x;
			break;
		case LEFT:
			nextY = y;
			nextX = x - 1;
			break;
		case UP:
			nextY = y - 1;
			nextX = x;
			break;
		default:
			break;
		}

		if (CanGo(nextY, nextX))
		{
			y = nextY;
			x = nextX;
			num++;
		}
		else
		{
			switch (dir)
			{
			case RIGHT:
				dir = DOWN;
				break;
			case DOWN:
				dir = LEFT;
				break;
			case LEFT:
				dir = UP;
				break;
			case UP:
				dir = RIGHT;
				break;
			default:
				break;
			}

		}
	}

}

int main()
{
	cin >> N;

	SetBoard();
	PrintBoard();

	return 0;
}

여기서 몇가지 고칠수 있는 부분이 있다.

switch (dir)
{
case RIGHT:
	nextY = y;
	nextX = x + 1;
	break;
case DOWN:
	nextY = y + 1;
	nextX = x;
	break;
case LEFT:
	nextY = y;
	nextX = x - 1;
	break;
case UP:
	nextY = y - 1;
	nextX = x;
	break;
default:
	break;
}

// 이부분을 고쳐보자
int dy[] = { 0,-1,0,1 };
int dx[] = { 1,0,-1,0 };
// 차이에 대한 배열을 선언

int nextY = y + dy[dir];
int nextX = x + dx[dir];
// nextY, nextX에 직접 대입
switch (dir)
{
case RIGHT:
	dir = DOWN;
	break;
case DOWN:
	dir = LEFT;
	break;
case LEFT:
	dir = UP;
	break;
case UP:
	dir = RIGHT;
	break;
default:
	break;
}

// 이부분을 고쳐보자
dir = (dir + 1) % 4;
// 위의 패턴에 맞게 수정
// 1을 더하고 나머지 연산을 이용해서 뺑뻉 돌게 만듦

태그:

카테고리:

업데이트: