/*
 * Created by SharpDevelop.
 * User: dwa2007
 * Date: 2011-10-16
 * Time: 오후 12:05
 * 
 * 요술사각형 - 가로, 세로, 대각선의 합의 같음
 * 1행의 중간을 1로 시작하여, 좌측 대각선 방향으로 올라가면서 빈칸에 1씩 증가된 숫자를 채운다.
 * 
 * 상단을 벗어나면 행의 최하단으로, 좌측을 벗어나면 같은 행의 최우측으로 이동하되, 이동하려는 칸이 비어 있지 않으면
 * 바로 빝의 칸으로 내려와 계속 실행한다. 
 * 
 * 각 행과 열 및 대각선의 합은 반드시 같아야 하고, 사각형의 행과 열의 개수는 같고, 반드시 홀수개어야 한다.
 */
using System;

namespace test
{
	class Program
	{
		public static void Main(string[] args)
		{
			int [,] Arr = new int[7,7];
			
			int r,c,val;
			val = 1;
			r = 0; // row 초기세팅
			c = 3; // col 초기세팅 
			
			Arr[r,c] = val;
			
			while(val <= Arr.Length -1){
				val++;
				
				if(r == 0 && c == 0) 
				{
					r++; //[0,0]이면 [0,1]로 값을 저장할 배열주소 세팅
				} else {
					if(r-- == 0) r = Arr.GetLength(0) - 1; //row가 0이면 
					if(c-- == 0) c = Arr.GetLength(1) - 1; //col이 0이면 
				}
										
				if (Arr[r,c] != 0){ //세팅한 배열주소에 이미 값이 존재하면 
					r += 2;
					c += 1;
				}
				
				//Console.WriteLine("{0},{1}", r,c);
				Arr[r,c] = val;
			}
			
			//여기부터는 값을 보여주는 곳 
			String s_val;	
			for(int i = 0; i < Arr.GetLength(0); i++){
				for(int j = 0; j < Arr.GetLength(1); j++){
					s_val = Arr[i,j].ToString();
					s_val = ("  " + s_val);
					s_val = s_val.Substring(s_val.Length - 2); //right함수
					Console.Write("{0}  ", s_val);
				}
				Console.WriteLine();
			}
			
			
			Console.Write("Press any key to continue . . . ");
			Console.ReadKey(true);
		}
	}
}

/*
28  19  10   1  48  39  30
29  27  18   9   7  47  38
37  35  26  17   8   6  46
45  36  34  25  16  14   5
 4  44  42  33  24  15  13
12   3  43  41  32  23  21
20  11   2  49  40  31  22
Press any key to continue . . .
*/