반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

코딩하기 좋은날

백준 3163 떨어지는 개미 본문

백준(Baekjoon) 문제

백준 3163 떨어지는 개미

huiung 2019. 4. 20. 23:38
반응형

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

문제와 채점은 위 사이트에서 확인 하실 수 있습니다.

 

이 문제는 막대에 개미가 있을 때 개미들이 떨어지는 순서를 구하는 문제입니다. 각 개미들은 이동 방향이 있고 충돌할

경우 방향이 바뀌게 되는데 이문제 같은 경우 충돌을 굳이 고려하지 않아도 되는데 그 이유는 왼쪽과 오른쪽으로 개미들이 떨어질 때 처음의 아이디 순서대로 반드시 떨어지기 때문입니다. 따라서 처음 위치를 입력받은 뒤 방향에 따라 떨어질 때까지 거리를 계산해서 절대값 순서로 정렬을 하였습니다. 그런다음 K번째 떨어지는 개미를 구하면 되는데 이 때 개미가 동시에 떨어 질때는 id가 작은 개미가 먼저 떨어지므로 절대값이 동일한 경우 두 id를 비교해서 swap을 해준 뒤 최종적으로 K번째 개미의 id를 찾아내면 됩니다. 생각보다 잘 안풀려서 아주 오래걸렸습니다,,

 

다음은 코드입니다.

 

#include <iostream>
#include <cmath>

using namespace std;

int arr[31][31];
int seq;
int N,r,c;

void search(int start, int end) {
	for(int i = start; i < start+2; i++) 
		for(int j = end; j < end+2; j++) {
			if(i == r && j == c) {
				cout<< seq;
			}
			seq++;
		}
}

bool check(int x, int y, int n) {
	int rootn = sqrt(n) - 1;
	
	if(x <= r && x+rootn >= r && y <= c && y+rootn >= c)
		return true;
	
	return false;
}

void divide(int startx,int starty, int n) {
	int rootn = sqrt(n);
	int midx = (startx + startx+rootn-1) / 2;
	int midy = (starty + starty+rootn-1) / 2;
	
	if(n == 4) {
		search(startx, starty);
	}
	else {		
		if(check(startx, starty, n/4))
			divide(startx, starty, n/4);
		if(check(startx, midy+1, n/4)) {
			seq = seq + n/4;
			divide(startx, midy+1, n/4);
		}
		if(check(midx+1, starty, n/4)) {
			seq = seq + n/4*2;
			divide(midx+1, starty, n/4);
		}
		if(check(midx+1, midy+1, n/4)) {
			seq = seq + n/4*3;
			divide(midx+1, midy+1, n/4);
		}
	}
}

int main(void) {
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	cin >> N >> r >> c;
	int size = pow(2, N);
	size = size * size;
	divide(0,0, size);
	
	return 0;
}
반응형

'백준(Baekjoon) 문제' 카테고리의 다른 글

백준 13460 구슬 탈출2  (0) 2019.04.27
백준 2263 트리의 순회  (0) 2019.04.20
백준 1074 Z  (0) 2019.04.20
백준 1934 최소공배수  (0) 2019.03.08
백준 9461 파도반 수열  (0) 2019.03.05