본문 바로가기
PS/백준

[백준 10997] 별 찍기 - 22

by 창이2 2021. 9. 19.

https://www.acmicpc.net/problem/10997

 

10997번: 별 찍기 - 22

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

www.acmicpc.net

 

다른풀이들 보면 재귀로 풀었는데

재귀쓸 필요없이

while문에 두면 풀이가 쉬워서 올림.

 

#include<stdio.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>


using namespace std;


char map[400][400];

#define LEFT 0
#define RIGHT 1
#define UP 2
#define DOWN 3

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	int n;
	cin >> n;

	int curX = 0;
	int curY = 4*n-3-1;
	int leftMargin = 0;
	int rightMargin = 0;
	int topMargin = 0;
	int bottomMargin = 0;
	int dir = LEFT;

	int centerX = ((4 * n - 1) / 2) + 1;
	int centerY = (curY / 2);

	for (int i = 0; i < 4 * n - 1; i++) {
		for (int j = 0; j < 4 * n - 3; j++) {
			map[i][j] = ' ';
		}
	}

	if (n == 1) {
		cout << "*";
		return 0;
	}

	while (!(curX == centerX && curY == centerY)) {
		if (dir == LEFT) {
			for (int i = curY; i >= leftMargin; i--) {
				map[curX][i] = '*';
				curY = i;
			}
			dir = DOWN;
		}

		if (dir == DOWN) {
			for (int i = curX; i < 4 * n - 1 - bottomMargin; i++) {
				map[i][curY] = '*';
				curX = i;
			}
			dir = RIGHT;
		}

		if (dir == RIGHT) {
			for (int i = curY; i < 4 * n - 3 - rightMargin; i++) {
				map[curX][i] = '*';
				curY = i;
			}
			dir = UP;
		}

		if (dir == UP) {
			topMargin += 2;
			for (int i = curX; i >= topMargin; i--) {
				map[i][curY] = '*';
				curX = i;
			}
			dir = LEFT;
			leftMargin += 2;
			bottomMargin += 2;
			rightMargin += 2;
		}


	}


	for (int i = 0; i < 4 * n - 1; i++) {
		for (int j = 0; j < 4 * n - 3; j++) {
			if (i == 1) {
				cout << "*";
				break;
			}
			cout << map[i][j];
		}
		cout << "\n";
	}


	return 0;
}

'PS > 백준' 카테고리의 다른 글

[백준 14906] 스러피  (0) 2021.09.22
[백준 10993] 별 찍기 - 18  (0) 2021.09.21
[백준 9370] 미확인 도착지  (0) 2021.08.09
[백준 2283] 구간 자르기  (0) 2021.07.27
[백준 9465] 스티커  (0) 2020.09.01

댓글