//////////////////////////////////////////////////////////////////////////////////////////
// 1 4 5 16 17
// 2 3 6 15 18
// 9 8 7 14 19
// 10 11 12 13 20
// 25 24 23 22 21
//
// 개미가 M X M 체스판에 올라갔다 체스판에 있는 모든 셀을 방문하려고 한다.
//그래서 판 한쪽 구석에서 시작하여 체스판을 한 꺼풀씩 훑어나가기로 했다.
//엘리스는 (1,1)자리부터 움직이기 시작했다. 처음에는 한칸 위로 올라간 다음,
//오른쪽으로 한칸 이동하고 다시 한칸 아래로 나려왔다.
//그리고 나서 한칸 오른쪽으로 움직여서 두칸 위로 올라가고 두칸 왼쪽으로 움직였다.
//이런식으로 매번 한행 그리고 한열씩 더 움직였다.
//예를 들어 엘리스가 25단계를 움직인 경로를 표시해보면 위의 그림과 같다.
//여기에서 각 숫자는 엘리스가 각 셀을 방문한 순서를 나타낸다.
//체스판이 매우 커서 움직일 수 있는 위치에 제한이 없다고 했을때
//엘리스의 위치를 결정하는 프로그램을 작성하여라.
//입력은 움직인만큼의 숫자가 되고 출력은 그만큼 움직였을때의 좌표를 나타낸다.
// 입력예 출력예
// 8 2,3
// 20 5,2
// 25 1,1
//////////////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
int main(void) {
int cnta; //1차 수열
int cntb; //2차 수열
int x, y, cnt; //정사각 위치
int suma; //합1
int sumb; //합2
int n; //인수
int sw; //스위치
while(scanf("%d", &n) && n != 0) {
cnta = cntb = suma = sumb = cnt = sw = 0;
while(sumb < n) {
suma += cnta;
suma += cntb;
sumb += ++cnta;
if(cnta >= 3) sumb += ++cntb;
x = y = ++cnt;
}
//감소탐색.
while(sumb > n) {
if(cnt % 2 == 0) //짝수 행.
x --;
else //홀수 행.
y --;
sumb --;
if(x == 0 || y == 0) {
sw = 1;
break;
}
}
//감소탐색 실패 시 증가탐색.
if(sw == 1) {
x = y = --cnt;
while(suma < n) {
if(cnt % 2 == 0) //짝수 행.
y --;
else //홀수 행.
x --;
suma ++;
}
}
printf("X좌표 : %d\t Y좌표 : %d\n", x, y);
}
return 0;
}
'C언어 프로그래밍' 카테고리의 다른 글
지그재그 출력 (0) | 2009.09.22 |
---|---|
링크드 리스트 기본 골격 프로그램 (0) | 2009.09.22 |
틱택토 (0) | 2009.09.15 |
성적 입력 출력 프로그래밍 (0) | 2009.09.15 |
최소,최대,평균,중간값 구하는 프로그래밍 (0) | 2009.09.15 |