(1) 마방진의 표를 그린다. (5x5, 8x8, 10x10 ...) 여기에선 간단히 5x5로 진행한다.
(2) 1은 가장 첫줄의 정중앙에서부터 시작한다.
(3) 정중앙에서 부터 시작은 마방진은 대각선방향으로 진행된다.
(4) 그리고 그림과 같이 대각선의 끝이 진행할 곳이 없을동안 계속 대각선으로 전진한다.
(5) 대각선에서 막힘이 일어나는경우,
그림과 같이 앞으로 진행할 대각선의 가장 아랫줄로 이동한다.
(6) 이후 '3'과 같이 대각선 방향이 세로가 아니라 가로로 막힘이 발생하는 경우는
그림과 같이 앞으로 진행해야 할 대각선의 가장 첫 줄로 이동한다.
(7) 가장 첫 줄로 이동한 이후부터는 이전과 같이 대각선 방향으로 동일하게 움직인다.
(8) 대각선으로 움직이다 '5'와 같이 이미 채워져있는 공간과 마주치는 경우,
그림과 같이 현재 숫자의 아래칸부터 이어나가는 방식으로 진행되게 된다.
위의 진행을 차례대로 따라 이후를 진행하면 마방진의 모든 칸을 채워서
아래의 그림처럼 완성할 수 있다.
마방진 완성모습
이를 코드로 작성해보자.
코드에 필요한 설명은 주석을 통해 언급하였다. 필요하다면 읽어보도록 하자.#include <stdio.h>#include <conio.h> //getch()를 위해 포함int main(){int a[6][6]; //기본 틀 만들기int i=1; // 차례로 커질 수int j=(int)(5/2+1); //처음에 중간 값 부터 시작하도록 만듦int NMG=0;int k=0;for(k=1;k<=25;k++){a[i][j]=k; //NMG =(int )(k-(k/5)*5);//k가 int이기 때문에 답에 소숫점이 나와도 int로 먼저 계산해버린다.// 따라서 (k/5)는 k가 5의 배수가 아닌이상 1-4는 전부 0이 나오게 되는 것을 이용하여//5번이상 한 라인에서 실행할 수 없게 만든 것이다.if(NMG==0){i++;}else{ //대각선으로 전진i--;j++;if(i<1){//만약 기존의 칸을 벗어나면, 가장 아래의 줄로 이동한다.i=5;}if(j>5){ //만약 기존의 칸을 벗어나면, 그 줄의 첫 번째로 이동한다.j=1;}}}//for//숫자들을 출력하기 위해서 실행for(i=1;i<6;i++){for(j=1;j<6;j++){printf("%3d ",a[i][j]);}printf("\n");}getch();}
댓글 없음:
댓글 쓰기