본문 바로가기
C#/C# Windows Form

C# 마방진

by TcTT 2017. 10. 13.
반응형
모든 프로그래밍에서 기초를 배우기위해서  삼각형으로 *찍기
또는 마방진 만들기를 많이사용한다..
오늘은 C#으로 마방진 만들기를 포스팅한다.
기초적인지그래서 로직만 잘생각해서 만든다면 크게 어려움은 없다..
이번 마방진은 홀수마방진을 푸는방식이다..
아래코드를 참고하여 짝수마방진도 지원하는 프로그램을 만들면 좋을거같다.



우선 마방진 푸는방법을 알아보자.
1. 정사각형의 맨 아랫줄 가운데에 숫자 1 을 둔다.
2. 이전 숫자 위치에서 오른쪽 아래칸이 비어 있으면 다음 숫자를 채운다.
3. 이전 숫자 위치에서 오른쪽 아래칸이 채워져 있으면 이전 숫자의 위칸에 다음 숫자를 채운다.
4. 오른쪽 아래칸이 사각형의 영역 밖이면 다음의 규칙을 따른다.
4-1. 수평 및 수직으로 이동해서 마지막 칸이 비어 있으면 해당 칸에 숫자를 채운다.
4-2. 수평 및 수직으로 이동해도 칸이 없는 경우 이전의 숫자 위치 위쪽 칸에 다음 숫자를 채운다.


위에 로직을 잘생각해서 코드로 변환하면된다.
소스를 좀더 깔끔하고 최적화 할 수 있겠지만 대충 생각나는대로 만들었다
주석처리를했으니 보기좋을거다.

실행모습:




소스코드 다운로드 :




소스코드:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace MaBangJin
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        //숫자만 입력받기.
        public bool pCheckNum(char char_ASCII)
        {
            if (char_ASCII >= 48 && char_ASCII <= 57)
            {
                return true;
            }
            return false;
        }
 
        //텍스트박스 숫자만 입력
        private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!pCheckNum(e.KeyChar) && e.KeyChar != 8)  //8:백스페이스
            {
                e.Handled = true;
            }
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            if (Convert.ToInt32(textBox1.Text) % 2 != 1)
            {
                MessageBox.Show("입력한 마방진의 크기가 홀수가 아닙니다.");
                return;
            }
 
            int size = Convert.ToInt32(textBox1.Text);
            int[,] arr = new int[size, size];
            int count = size * size;
 
            int nextrow = 0;
            int nextcol = 0;
 
            // 다음 배열위치를 저장해둘 변수
            nextrow = size;
            nextcol = (size / 2+ 1;
 
            // 배열이 0부터시작하므로 -1씩해줘야한다.
            nextrow = nextrow - 1;
            nextcol = nextcol - 1;
            size = size - 1;
 
            // 이전 배열위치를 저장해둘 변수
            int oldrow = nextrow;
            int oldcol = nextcol;
 
            // 2차원 배열 초기화
            for (int i = 0; i < arr.Length / Convert.ToInt32(textBox1.Text); i++)
            {
                for (int j = 0; j < arr.Length / Convert.ToInt32(textBox1.Text); j++)
                {
                    arr[i, j] = 0;
                }
            }
 
            for (int i = 1; i <= count; i++)
            {
                try
                {
                    //줄이나 칸 둘중 하나라도 넘어가면 아래 로직 처리..
                    if (nextrow > size || nextcol > size)
                    {
                        // 줄만 넘어갔을떄
                        if (nextrow > size && nextcol <= size)
                        {
                            nextrow = 0;
                        }
                        // 칸만 넘어갔을때
                        if (nextrow <= size && nextcol > size)
                        {
                            nextcol = 0;
                        }
                        // 둘다 넘어갈때
                        if (nextrow > size && nextcol > size)
                        {
                            nextrow = oldrow - 1;
                            nextcol = oldcol;
                        }
                    }
                    // 오른쪽 아래에 숫자가 들어가있으면
                    if (arr[nextrow, nextcol] != 0)
                    {
                        nextrow = oldrow - 1;
                        nextcol = oldcol;
                    }
 
                    //배열에 마방진으로 숫자 채워넣기.
                    arr[nextrow, nextcol] = i;
 
                    //지금넣어둔 위치 저장시켜두기.
                    oldrow = nextrow;
                    oldcol = nextcol;
 
                    //다음위치를 찾기위해 아래, 오른쪽 한칸씩 이동
                    nextrow = nextrow + 1;
                    nextcol = nextcol + 1;
                }
                catch (Exception err)
                {
 
                }
            }// end of for
 
            //리치텍스트박스에 출력
            for (int i = 0; i < arr.Length / Convert.ToInt32(textBox1.Text); i++)
            {
                richTextBox1.AppendText("\n");
                for (int j = 0; j < arr.Length / Convert.ToInt32(textBox1.Text); j++)
                {
                    richTextBox1.AppendText(arr[i, j].ToString() + " ");
                }
            }
        }
    }
}
 
cs


반응형

'C# > C# Windows Form' 카테고리의 다른 글

C# 무료 스프레드 툴  (0) 2018.06.10
C# 비활성창 스크린샷  (2) 2017.11.10
C# string To DateTime  (2) 2017.09.18
C# 하드번호  (0) 2017.08.09
C# Google Adsense  (6) 2017.07.21