마방 진 알고리즘

7059 단어
"마방 진" 을 출력 합 니 다.마방 진 이란 이런 방진 을 말 하 는데 그 줄 마다, 열 마다, 대각선 의 합 이 모두 같다.예 를 들 어, 3 단계 마방 진 은      8 1 6      3 5 7      492 1 ~ n * n 의 자연수 로 구 성 된 큐 브 진 을 출력 해 야 합 니 다.
해: 마방 진 에서 각 수의 배열 규칙 은 다음 과 같다.
(1) 1 을 1 줄 의 중간 열 에 놓는다.
(2) 2 부터 n 까지×n. 각 수 를 다음 규칙 에 따라 저장 합 니 다. 각 수 에 저 장 된 줄 은 앞의 줄 보다 1 을 줄 이 고 열 수 는 1 을 추가 합 니 다 (예 를 들 어 위의 3 단계 마방 진, 5 는 4 의 이전 줄 뒤에 있 습 니 다)
(3) 위의 줄 수가 1 이면 다음 줄 수 는 n 이다.예 를 들 어 1 이 첫 줄 에 있 으 면 2 는 맨 다음 줄 에 두 어야 하고 열 수 는 똑 같이 + 1 이다.
(4) 이전 수의 열 이 n 일 때 다음 수의 열 수 는 1 이 고 줄 수 는 1 이 어야 한다. 예 를 들 어 2 는 3 줄 의 마지막 열 에 있 으 면 3 은 두 번 째 줄 의 첫 번 째 열 에 두 어야 한다.
(5) 위의 규칙 에 따라 확 정 된 위치 에 이미 숫자 가 있 거나 위의 숫자 가 첫 번 째 줄 의 n 열 일 때 다음 수 를 위의 수의 아래 에 놓는다.예 를 들 어 위의 규정 에 따 르 면 4 는 1 행 2 열 에 놓 아야 하지만 이 위 치 는 이미 1 이 차지 하기 때문에 4 는 3 에 놓 아야 한다.
아래.6 은 1 행 3 열 (즉 마지막 열) 이기 때문에 7 은 6 아래 에 놓는다.이 방법 으로 모든 단계 의 마방 진 을 획득 할 수 있 습 니 다.
 
코드:
 1 #include 
 2 using namespace std;
 3 #define MIN 1
 4 #define MAX 20
 5 #define EMPTY 0
 6 
 7 signed main()
 8 {
 9     int magic_square[MAX][MAX]={EMPTY};
10     int n;
11 
12     printf("     (1~15     ):");
13     scanf("%d",&n);
14     if( nMAX || !(n%2) ) printf("    ,     !
"); 15 else{ 16 int num; 17 const int _begin=1,_end=n*n; 18 int row,col; 19 for(num=_begin; num<=_end; num++){ 20 if( num==_begin ){ 21 row=0; 22 col=n/2; 23 } 24 else{ 25 int row_n=(row-1+n)%n; 26 int col_n=(col+1)%n; 27 if( magic_square[row_n][col_n]!=EMPTY ){ 28 row++; 29 } 30 else{ 31 row=row_n; 32 col=col_n; 33 } 34 } 35 magic_square[row][col]=num; 36 } 37 } 38 int row,col; 39 for(row=0;row){ 40 for(col=0;col){ 41 printf("%5d",magic_square[row][col]); 42 } 43 printf("
"); 44 } 45 return 0; 46 }

좋은 웹페이지 즐겨찾기