Honux BBS
  • About
  • All posts

[알고리즘] BOJ 1022 소용돌이 예쁘게 출력하기 - Sun, Jan 3, 2021

예쁘게 찍는게 너무 힘들었다. 역시 외모투자는 가성비가 낮구나.

만만히 봤다가 어렵게 풀었다.

문제 링크

  • 소용돌이 배열을 예쁘게 찍는 문제
  • 생각보다 많이 어렵다.
  • 무작위로 전부 다 채우면 메모리 에러가 발생한다.
  • 정확하게 주어진 출력 범위의 답만 찾아서 예쁘게 출력해야 한다. 예쁘게가 꽤 어렵다.
  • 풀고 나서 다른 답안을 보니 수학적으로 getValue(i, j) 를 구해서 풀 수도 있다.
#include <cstdio>
#include <iostream>
#include <iomanip>
#include <vector>
#include <algorithm>

using namespace std;
using ull = long long int;

int sr = 0;
int sc = 0;
int v = 1;
int delta = 1;
int csize = 1;
bool dc = true;
int a[50][5];

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    int r1, c1, r2, c2, mr, mc;
    cin >> r1 >> c1 >> r2 >> c2;
    mr = -r1;
    mc = -c1;
    int fillCount = (r2 - r1 + 1) * (c2 - c1 + 1);
    int currentFill = 0;
    int vmax;

    while (currentFill < fillCount)
    {
        for (int t = 0; t < 2; t++)
        {
            for (int i = 0; i < csize; i++)
            {
                if (sr >= r1 && sr <= r2 && sc >= c1 && sc <= c2)
                {
                    a[sr + mr][sc + mc] = v;
                    currentFill++;
                    vmax = v;
                }

                //cerr << sr << " " << sc << " " << v << " " << currentFill << "\n";
                v++;
                if (dc)
                    sc += delta;
                else
                    sr += delta;
            }
            dc = !dc;
            delta *= -1;
        }
        delta *= -1;
        csize++;
    }

    int w = 0;
    while (vmax != 0)
    {
        vmax /= 10;
        w++;
    }

    for (int i = 0; i <= r2 - r1; i++)
    {
        for (int j = 0; j <= c2 - c1; j++)
        {
            cout << setw(w) << a[i][j] << " ";
        }
        cout << "\n";
    }

    return 0;
}


© 2020 | Hugo

GitHub