본문 바로가기
프로그래밍/알고리즘

2074: 마방진

by 카라미 2015. 4. 21.

2074: 마방진

시간제한: 1 Sec  메모리제한: 64 MB  Special Judge
제출: 876  해결: 589

홀수 정사각형의 크기를 입력 받은 후, 가로 세로 대각선의 합이 일정한 마방진을 출력하는 프로그램을 작성하시오.

마방진이란 1부터 N*N까지의 숫자를 한 번씩만 써서 정사각형에 배치하여 가로와 세로, 그리고 대각선의 합이 같도록 하는 것이다.

다음의 순서에 따라 각 위치에 차례대로 값을 넣는다.
1. 첫 번째 숫자인 1을 넣는 위치는 첫 번째 행 가운데이다.
2. 숫자가 N의 배수이면 바로 아래의 행으로 이동하여 다음의 수를 넣고
3. 그렇지 않으면 왼쪽 위로 이동하여 다음의 숫자를 넣는다. 만약 행이 첫 번째를 벗어나면 마지막 행으로 이동하고, 열이 첫 번째를 벗어나면 마지막 열로 이동한다.

1. 첫 번째 행 가운데(1,2)에 1을 넣는다.
2. 왼쪽 위로 이동하면 (0,1)인데 행의 위치가 처음을 벗어났으므로 마지막행(3,1)의 위치로 이동하여 2를 넣는다.
3. 왼쪽 위로 이동하면 (2,0)인데 열의 위치가 처음을 벗어났으므로 마지막열(2,3)의 위치로 이동하여 3을 넣는다.
4. 배열에 넣은 값(3)이 N의 배수이므로 바로 아래행으로(3,3) 이동하여 4를 넣는다.
5. 왼쪽 위로 이동하여 (2,2) 5를 넣는다.
6. 왼쪽 위로 이동하여 (1,1) 6를 넣는다.
7. 배열에 넣은 값(6)이 N의 배수이므로 바로 아래행으로(2,1) 이동하여 7을 넣는다.
8. 왼쪽 위로 이동하면 (1,0)인데 열의 위치가 처음을 벗어났으므로 마지막열(1,3)의 위치로 이동하여 8을 넣는다.
9. 왼쪽 위로 이동하면 (0,2)인데 행의 위치가 처음을 벗어났으므로 마지막행(3,2)의 위치로 이동하여 9를 넣는다.

정사각형의 크기 n(2부터 100사이의 홀수)을 입력받는다.

위에서 언급한 형태로 정사각형의 내부 숫자를 차례로 채운 후의 모습을 출력한다. 숫자 사이는 공백으로 구분한다.

3

6 1 8
7 5 3
2 9 4



<<해결방법>>


해결방법은 문제에 자세히 설명이 되어있습니다.

제시하는 규칙만 천천히 파악해보면

어렵지 않게 해결 할 수 있습니다.




for (num = 2; num <= n * n; num++) {

                    int basu = num-1; 바로 직전에 채워진 값을 basu 변수에 넣는다.

if (basu % n == 0) {//규칙중에 배수가 나오면 다음 수는 바로 아래쪽에 입력하라는 규칙이 있으니까 먼저 배수인지 확인하고 배수라면, 배열의 바로 아래행에 값 넣음. 

arr[++x][y] = num;

} else {//배수가 아니고, 

// 현재행이 가장 위라면 가장 아래로. 아니라면 하나 위로  (입력할 칸을 벗어난 경우)

if (x == 0)

x = n - 1;

else

x--;

// 현재열이 가장 제일 왼쪽이면 제일 오른쪽으로, 아니면 하나 왼쪽으로

if (y == 0)

y = n - 1;

else

y--;

arr[x][y] = num;

}


5

15 8 1 24 17
16 14 7 5 23
22 20 13 6 4
3 21 19 12 10
9 2 25 18 11


규칙대로 대각선 위쪽으로 쭉 채우면 되는데...  

채우다가 입력할 부분의 인덱스가 벗어나는 경우에는 제시해 준 규칙대로 배열의 인덱스를 바꾸어 주면 된다. 

전체 내용은 파일에서 보세요^^ 


'프로그래밍 > 알고리즘' 카테고리의 다른 글

1495: 대각선 지그재그  (0) 2015.04.21
1997: 떡 먹는 호랑이  (0) 2015.04.21
1014: 돌다리 건너기  (0) 2015.04.21
1331: 문자마름모  (0) 2015.04.21
1707: 달팽이사각형  (0) 2015.04.21