http://acm.uva.es/p/v102/10237.html
문제요약
n*n의 체스판에 k개의 비숍을 서로 이동범위안에 들어가지 않도록 하는 경우의 수를 구하시오
풀이보기
소스보기
n이 짝수 일 경우 c1과 c2가 같으므로 하나만 계산해도 돼지만 나누기 귀차나서 -.-;;
덧) 아직 AC는 나오지 않았습니다.
http://acm.uva.es/p/v102/10237.html
문제요약
n*n의 체스판에 k개의 비숍을 서로 이동범위안에 들어가지 않도록 하는 경우의 수를 구하시오
풀이보기
소스보기
n이 짝수 일 경우 c1과 c2가 같으므로 하나만 계산해도 돼지만 나누기 귀차나서 -.-;;
덧) 아직 AC는 나오지 않았습니다.
http://acm.uva.es/p/v110/11092.html
문제요약
위 그림과 같이 번호를 매긴다..
a,b가 주어질때 a,b의 순차적으로 찾아갈때의 거리와, 최단거리로 갈때의 거리를 구하시오
(입력의 끝은 EOF)
입력예
1 2
1 3
1 4
1 7
1 8
1 9
출력예
1.000 1.000
2.000 1.732
3.000 2.000
6.000 1.000
7.000 1.000
8.000 1.000
풀이(긁어주세요)
주어진 두 꼭지점의 좌표를 찾은다음 피타고라스를 사용합니다
각각 1개, 6개, 12개, 18개... 의 육각형으로 나눕니다
그리고 육각형의 어느부위에 속하는지(6가지로 나눠지겠죠) 알아봅니다
그리고 좌표를 구합니다. (위 방식으로 나누면 규칙성이 보일꺼에요 ^^)
중요부분 소스
#define se 0.8660254037844 // 2분의 루트3
#define ga 0.5 // 2분의 1
for(i=1;i*(i+1)*3 < a;i++);
a-=(i-1)*(i)*3; //사실 근의공식을 사용하면 for문 돌릴 필요 없습니다..
switch((a-1)/i){
case 0 : a=(a-1)%i+1; *x= ga*(i+a), *y = se*(i-a); break;
case 1 : a=(a-1)%i+1; *x= ga*(i*2-a), *y = -se*(a); break;
case 2 : a=(a-1)%i+1; *x= ga*(i-a*2), *y = -se*(i); break;
case 3 : a=(a-1)%i+1; *x= -ga*(i+a), *y = -se*(i-a); break;
case 4 : a=(a-1)%i+1; *x= -ga*(i*2-a),*y = se*(a); break;
case 5 : a=(a-1)%i+1; *x= -ga*(i-a*2),*y = se*(i); break;
}