https://www.acmicpc.net/problem/1891
1891번: 사분면
첫 줄에 이동시키려는 사분면 조각 번호의 자릿수를 나타내는 정수 d와, 그 사분면 조각의 번호가 주어진다. (1≤d≤50) 둘째 줄에는 이동의 내용을 나타내는 두 정수가 x, y가 주어진다. (|x|, |y|≤2
www.acmicpc.net
이 사분면은 다른 사분면과 다른 특징이 있다.
21
34
라는 구조로 이루어져있고,
깊어질수록 왼쪽에서 오른쪽으로 입력된다.
d는 1~50까지 주어지므로
50~1까지 다 입력이 되기때문에 사분면 조각의 번호는 문자열로 받았고,
x,y는 2^50 이므로 long long타입으로 받았다.
이 사분면은 규칙이 있는데

이 사진에서 보면 2의 배수로 증가 또는 감소를 하면서
이동을 하게된다는것
그러면 첫 매우 큰 사각형은 2^d-1로 시작을 하면서 문자열마다 체크를 해주고,
만약 범위를 벗어났다면 앞문자열을 변경해주는 방법으로 제귀를 통해 풀었다.
앞문자열을 변경하다가 끝에 도달했다면 이동할수없는 구간이므로 -1를 리턴해주었다.
#include <iostream>
#include <algorithm>
#include <string>
#include <cmath>
using namespace std;
#define ll long long
int d;
string dnum;
long long movex, movey;
bool changecheck = false;
void change(int num,int startdnum, bool xy)
{
//x기준
if (startdnum <0)
{
changecheck = true;
return;
}
if (xy)
{
if (dnum[startdnum] == '2')
{
if (num == 1)
{
dnum[startdnum] = '1';
}
else if (num == -1)
{
dnum[startdnum] = '1';
change(num, startdnum - 1, xy);
}
}
else if (dnum[startdnum] == '1')
{
if (num == 1)
{
dnum[startdnum] = '2';
change(num, startdnum - 1, xy);
}
else if (num == -1)
{
dnum[startdnum] = '2';
}
}
else if (dnum[startdnum] == '3')
{
if (num == 1)
{
dnum[startdnum] = '4';
}
else if (num == -1)
{
dnum[startdnum] = '4';
change(num, startdnum - 1, xy);
}
}
else if (dnum[startdnum] == '4')
{
if (num == 1)
{
dnum[startdnum] = '3';
change(num, startdnum - 1, xy);
}
else if (num == -1)
{
dnum[startdnum] = '3';
}
}
}
//y기준
else
{
if (dnum[startdnum] == '2')
{
if (num == 1)
{
dnum[startdnum] = '3';
change(num, startdnum - 1, xy);
}
else if (num == -1)
{
dnum[startdnum] = '3';
}
}
else if (dnum[startdnum] == '1')
{
if (num == 1)
{
dnum[startdnum] = '4';
change(num, startdnum - 1, xy);
}
else if (num == -1)
{
dnum[startdnum] = '4';
}
}
else if (dnum[startdnum] == '3')
{
if (num == 1)
{
dnum[startdnum] = '2';
}
else if (num == -1)
{
dnum[startdnum] = '2';
change(num, startdnum - 1, xy);
}
}
else if (dnum[startdnum] == '4')
{
if (num == 1)
{
dnum[startdnum] = '1';
}
else if (num == -1)
{
dnum[startdnum] = '1';
change(num, startdnum - 1, xy);
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> d >> dnum;
cin >> movex >> movey;
//dnum바꿀위치
int startdnum = 0;
while (d)
{
long long dpow = pow(2, d-1);
long long movexcount = movex / dpow;
long long moveycount = movey / dpow;
movex = movex % dpow;
movey = movey % dpow;
change(movexcount, startdnum, true);
change(moveycount, startdnum, false);
if (changecheck)
{
cout << "-1";
return 0;
}
startdnum++;
d--;
}
cout << dnum;
}
'알고리즘' 카테고리의 다른 글
| 백준 1201 NMK C++ (0) | 2021.09.09 |
|---|---|
| 16954 움직이는 미로 탈출 C++ DFS deque (0) | 2021.09.05 |
| 프로그래머스 압축 (0) | 2021.08.25 |
| 4256 트리 (0) | 2021.08.21 |
| 6416 백준 트리인가? (0) | 2021.08.20 |