블로그 언저리인 무언가
[백준/BOJ] 1022 소용돌이 예쁘게 출력하기 본문
728x90
문제 : 1022 소용돌이 예쁘게 출력하기
[0,0], [1,1], [2,2].. 는 1, 9, 25...로 제곱수로 나타나기 때문에
[x, x]=(x*2+1)^2를 이용해 기준점으로 잡고 구현해나가면 된다.
좌표 중 절댓값이 큰 것을 기준으로 x번째 껍질에 들어가게 되는데
이때 어느 변에 있냐에 따라서 네 꼭짓점을 기준으로 더해주거나 빼면
시뮬레이션 작업 없이도 구현할 수 있다.
이후 가장 큰 값을 기준으로 setw() 함수를 이용해 공백을 출력해주면 된다.
Code
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll r1, r2, c1, c2, mx, bl;
ll f(ll x, ll y){
ll ret=0, chk=max(abs(x),abs(y));
ret=(chk*2+1)*(chk*2+1); // 오른쪽아래 꼭짓점 값
if (x==chk) // 아랫변
ret+=y-chk;
else if (-x==chk) // 윗변
ret-=y+chk*5;
else if (y==chk) // 오른쪽변
ret-=x+chk*7;
else // 왼쪽변
ret+=x-chk*3;
return ret;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin >> r1 >> c1 >> r2 >> c2;
for (int i=r1;i<=r2;i++){
for (int j=c1;j<=c2;j++)
mx=max(mx,f(i,j));
}
for (;mx;bl++,mx/=10); // 공백길이 지정
for (int i=r1;i<=r2;i++){
for (int j=c1;j<=c2;j++){
if (j!=c1)
cout << " ";
cout << setw(bl) << f(i,j);
}
if (i!=r2)
cout << "\n";
}
}
728x90
'Programming > BOJ' 카테고리의 다른 글
[백준/BOJ] 1025 제곱수 찾기 (0) | 2022.09.19 |
---|---|
[백준/BOJ] 17085 십자가 2개 놓기 (0) | 2022.09.16 |
[백준/BOJ] 14948 군대탈출하기 (0) | 2022.09.16 |
[백준/BOJ] 20056 마법사 상어와 파이어볼 (1) | 2022.09.16 |
[백준/BOJ] 25201 보드 뒤집기 게임 (1) | 2022.09.16 |
Comments