기술 블로그

16945번 매직 스퀘어로 변경하기 본문

알고리즘 문제/BOJ

16945번 매직 스퀘어로 변경하기

parkit 2019. 3. 30. 16:20
728x90
반응형

https://www.acmicpc.net/problem/16945



백트래킹 문제이다.


거의 풀렸다고 생각했는데 잘 안 풀렸다.


나는 미리 만들어진 배열을 활용하였기 때문이다.(진작 찾는 방식으로 하였으면 바로 풀렸을텐데 아쉬웠다.)


다른 분의 코드의 힌트를 참고하여 풀었다.


마침 내가 구현한 코드 및 구현 방식 그리고 생각과 거의 유사하여 바로 풀 수 있었다.


난이도는 엄청 어렵지는 않았다.




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
#include <iostream>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <cstring>
#include <string>
#include <math.h>
#include <algorithm>
#include <map>
#include <set>
#include <sstream>
#include <tuple>
 
#pragma warning(disable:4996)  
#pragma comment(linker, "/STACK:336777216")
 
using namespace std;
 
int Map[9= { 0, }, s[9= { 0, }, N = 0, MIN = 0;
 
bool use[10= { false, }, visit[3][3= { false, };
 
bool chk()
{
    int r = s[0+ s[1+ s[2];
 
    for (int i = 3; i <= 6; i += 3)
    {
        int nr = s[i] + s[i + 1+ s[i + 2];
 
        if (nr != r) return false;
    }
 
    int c = s[0+ s[3+ s[6];
 
    for (int i = 1; i <= 2; i++)
    {
        int nc = s[i] + s[i + 3+ s[i + 6];
 
        if (nc != c) return false;
    }
 
    int d = s[0+ s[4+ s[8];
 
    int nd = s[2+ s[4+ s[6];
 
    if (d != nd) return false;
 
    return true;
}
 
void simulation(int pos)
{
    if (pos == 9)
    {
        if (chk())
        {
            int calc = 0;
 
            for (int i = 0; i < 9; i++) calc += abs(Map[i] - s[i]);
            
            MIN = min(MIN, calc);
        }
 
        return;
    }
 
    for (int i = 1; i <= 9; i++)
    {
        if (!use[i])
        {
            use[i] = true;
            s[pos] = i;
 
            simulation(pos + 1);
 
            use[i] = false;
            s[pos] = 0;
        }
    }
}
 
int main(void)
{
    MIN = INT32_MAX;
 
    for (int i = 0; i < 9; i++scanf("%d"&Map[i]);
 
    simulation(0);
 
    printf("%d\n", MIN);
 
    return 0;
}
cs







728x90
반응형

'알고리즘 문제 > BOJ' 카테고리의 다른 글

15683번 감시  (0) 2019.04.02
16988번 Baaaaaaaaaduk2 (Easy)  (0) 2019.04.01
16936번 나3곱2  (0) 2019.03.29
6087번 레이저 통신  (0) 2019.03.28
16932번 모양 만들기  (1) 2019.03.27