2013년 3월 22일 금요일

마방진 알고리즘


마방진(magic square)이란 가로,세로, 대각선의 합이 같은 사각형을 말한다.




구현 방법은

시작은 첫행 , 중간열 에서 1 을 두고
행을 감소, 열을 증가하면서 순차적으로 수를 넣어간다.
예외처리 두 가지


입출력 예

입력

9

출력

  8  1  6
  3  5  7
  4  9  2
---------------------------------------------------------

#include<stdio.h>
#include<math.h>
void main()
{
int sq[100][100]={0}; //마방진칸
int i,j; //for문 변수
int a,b=1,num2; // num2=마방진 칸을 제곱근으로 바꿔 배열설정
int x=0,y=0;
double num; //num= 마방진 칸수


do //마방진 입력이 잘못되었으면 재입력
{
printf("마방진의 칸수(홀수의 제곱수_최대 100)를 입력하세요: ");
scanf("%lf", &num);


while((int)num%2==0 || num>100);

num2=sqrt(num); //num 제곱근으로 변경
a=num2/2;
sq[0][a]=b;
x=num2/2;
for(i=0;i<num-1;i++)
{
b+=1;
int yy=y-1;
int xx=x+1;



if(yy<0)     //위로 올라갈곳이없을시 가장아래로 이동

yy=num2-1;    

if(xx>num2-1)  //오른쪽으로 이동이불가능할시 맨왼쪽으로 이동

xx=0;

if(sq[yy][xx]!=0) //이동하려는곳에 숫자가 이미있을경우 아래로 이동
{
y+=1;
if(y>=num2)
y=0;
}
else
{
x=xx;
y=yy;
}
sq[y][x]=b;
}
for(i=0;i<num2;i++)
{
for(j=0;j<num2;j++)
{
printf("%3d",sq[i][j]);

}
printf("\n");
}

}


댓글 1개: