[논리적 사유연습]홀수 마방진구하기

2013. 5. 15. 11:10프로그래밍/C/C++

#include <stdio.h>

int main()
{
 int magic[19][19]; //최대 19*19의 마방진을 생성하는 2차원 배열
 int size, x, y, i, saveX, saveY;
  
 do{ 
  scanf("%d", &size);  //마방진의 크기를 입력받는다.
 }while(size<3 || size>19 || size %2==0); //3에서 19사이의 홀수를 입력받을 때 까지 반복
  
 //2차원 배열의 모든 요소를 0으로 초기화 시킨다.
 for(y=0 ; y<size ; y++) 
 { 
  for(x=0 ; x<size ; x++) 
  { 
   magic[y][x] = 0;  
  } 
 }
 
 //최상단 가운데 지점에 1을 넣기 위해 x, y 좌표를 설정
 x = size/2;
 y=0;
  
 //위에서 설정한 초기 좌표에 1을 대입
 magic[y][x] = 1;

 //반복문을 돌며 2부터 size*size까지의 수를 규칙에 따라 대입
 for(i=2 ; i<=size*size ; i++) 
 { 
  //현재의 좌표를 save변수에 저장
  saveX = x; 
  saveY = y;
  
  //x, y 좌표를 좌측 상단으로 이동(↖)
  x--;  
  y--;
  
  //x좌표가 -인경우 x좌표를 가장 우측으로 설정
  if(x<0)  
   x=size-1;
  
  //y좌표가 -인경우 y좌표를 맨 아래로 설정
  if(y<0)   
   y=size-1;
   
  //좌측 상단(↖)의 좌표에 값이 이미 있는 경우
  if(magic[y][x] > 0) 
  { 
   //좌표를 좌측 상단(↖)의 하단(↓)으로 이동
   //좌측 상단(↖)으로 이동하기 전 좌표값에서 아래방향(↓)으로 한칸 이동시킨다.
   x = saveX; 
   y = saveY+1; 
  } 
  magic[y][x] = i; //설정된 좌표값에 숫자를 대입
 } 

 //2차원 배열을 화면에 출력
 for(y=0 ; y<size ; y++) 
 { 
  for(x=0 ; x<size ; x++) 
  { 
   printf("%2d ", magic[y][x]); 
  } 
  printf("\n"); //하나의 행이 끝나면 한줄을 내린다.
 }
 
 return 0; 
}

 

 


각 행과 열의 합을 출력하는 코드 추가

 

#include <stdio.h>

int main()
{
 int magic[19][19]; //최대 19*19의 마방진을 생성하는 2차원 배열
 int size, x, y, i, saveX, saveY, col[19], row;
  
 do{ 
  scanf("%d", &size);  //마방진의 크기를 입력받는다.
 }while(size<3 || size>19 || size %2==0); //3에서 19사이의 홀수를 입력받을 때 까지 반복
  
 //2차원 배열의 모든 요소를 0으로 초기화 시킨다.
 for(y=0 ; y<size ; y++) 
 { 
  for(x=0 ; x<size ; x++) 
  { 
   magic[y][x] = 0;
  } 
  col[y] = 0;
 }
 
 //최상단 가운데 지점에 1을 넣기 위해 x, y 좌표를 설정
 x = size/2;
 y=0;
  
 //위에서 설정한 초기 좌표에 1을 대입
 magic[y][x] = 1;

 //반복문을 돌며 2부터 size*size까지의 수를 규칙에 따라 대입
 for(i=2 ; i<=size*size ; i++) 
 { 
  //현재의 좌표를 save변수에 저장
  saveX = x; 
  saveY = y;
  
  //x, y 좌표를 좌측 상단으로 이동(↖)
  x--;  
  y--;
  
  //x좌표가 -인경우 x좌표를 가장 우측으로 설정
  if(x<0)  
   x=size-1;
  
  //y좌표가 -인경우 y좌표를 맨 아래로 설정
  if(y<0)   
   y=size-1;
   
  //좌측 상단(↖)의 좌표에 값이 이미 있는 경우
  if(magic[y][x] > 0) 
  { 
   //좌표를 좌측 상단(↖)의 하단(↓)으로 이동
   //좌측 상단(↖)으로 이동하기 전 좌표값에서 아래방향(↓)으로 한칸 이동시킨다.
   x = saveX; 
   y = saveY+1; 
  } 
  magic[y][x] = i; //설정된 좌표값에 숫자를 대입
 } 

 //2차원 배열을 화면에 출력
 for(y=0 ; y<size ; y++) 
 { 
  row = 0;
  for(x=0 ; x<size ; x++) 
  { 
   row += magic[y][x]; //가로 행의 값을 더한다.
   col[x] += magic[y][x]; //세로 열의 값을 더해서 열 배열에 저장
   printf("%4d ", magic[y][x]); 
  } 
  printf("%d", row); //가로행의 값을 한줄을 내리기 전에 출력
  printf("\n"); //하나의 행이 끝나면 한줄을 내린다.
 }
 for(x=0 ; x<size ; x++)
 {
  printf("%4d ", col[x]); //마방진의 출력이 끝난뒤 열의 값을 한줄로 출력
 }
 printf("Sum\n"); //하나의 행이 끝나면 한줄을 내린다.
 
 return 0; 
}