[알고리즘] 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;
}