본문 바로가기

C언어 프로그래밍

체스판위의 개미

//////////////////////////////////////////////////////////////////////////////////////////
//              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