~cpp 

#include <iostream>
using namespace std;

int main()
{
	int size;
	int i, j;

	do{					//홀수 입력할 때까지 반복
					
		cout << "마방진 사이즈 입력(홀수) : ";
		cin >> size;
		if ( !(size%2))
			cout << "다시입력!\n";
	}while(!(size%2));				 

	int **board = new int * [size+2];	        //동적 2차원 배열 생성 
	for(i=0; i< size+2; i++)
		board[i] = new int [size+2];
	
	for(i=0; i<size+2; i++)			//배열 초기화
		for(j=0; j<size+2; j++)
			board[i][j] = 0;

	int num = 1;
	int row = 1;
	int mid = size / 2;
	int col = mid + 1;

	board[row][col] = num;

	while(num != size*size)			//숫자를 다 넣을때까지 반복
	{
		row --; col ++;				//한칸 위로, 한칸 오른쪽으로

		if (row == 0)			//벽에 부딪칠 경우
			row = size;
                   				//좌표 변환 
		if (col == size+1)			//벽에 부딪칠 경우
			col = 1;			//좌표 변환
                    

		if (!board[row][col])			//자리가 비어있을 경우  
		{
			num++;					
			board[row][col] = num;	//숫자 대입
	
		}

		else					//자리에 다른 숫자가 있을 경우
		{
			row ++; col --;			//움직이기 전으로 돌아옴 

			if (row == 0)			//벽에 부딪칠 경우
				row = size;			//좌표 변환
			if (col == size)		//벽에 부딪칠 경우
				col = 1;			//좌표 변환 

			if ( row == size && col == 1)//좌표가 왼쪽 맨 아래인 경우
			{
				row=1; col = size;	     //오른족 맨 위로 
			}

			else				 //그 밖의 경우
			{
				row--; col++;		     //되돌림 	
			}
		
			row++;					//한칸 밑으로 	
			num++;				
			board[row][col] = num;	//숫자 대입 
		}
	}

	for(i=1; i<size+1; i++)			//출력 
	{
		for(j=1; j<size+1; j++)
		{
			cout << board[i][j] <<"\t";
		}
		cout << "\n";
	}

	return 0;
}




Retrieved from http://wiki.zeropage.org/wiki.php/MagicSquare/은지
last modified 2021-02-07 05:23:43