문제를 풀 방법을 궁리하는데 꽤 걸렸다.
내가 발견한 해결책은
예를 들어 2x2라면 0000,0001,0010........1111(총 16가지)를 배열에 넣고 (넣는 방법은 이진수를 이용했다)
0이면 가로 1이면 세로로 정한다음
가로로 한번 읽어 생긴 값과 세로로 한번 읽어 생긴 값을 더하는 것이다.
어려운 문제처럼 보이지만 해결법만 찾으면 그리 어렵지 않게 풀 수 있는 문제다.
코드
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 | #include<iostream> #include<stdio.h> #include<queue> #include<vector> #include<math.h> #include<memory.h> using namespace std; int map[4][4]; int dir[4][4]; bool check[4][4]; vector<int>arr; int n, m; vector<int>change2jin(int i) { vector<int>tmp; tmp.resize(n*m); for (int j = 0; j < n*m; j++) { tmp[j] = i % 2; i = i / 2; } return tmp; } int main() { //freopen("Text.txt", "r", stdin); cin >> n >> m; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { scanf("%1d", &map[i][j]); } } arr.resize(n*m); int ans = -1; for (int i = 0; i < pow(2, (n*m)); i++) { memset(check, false, sizeof(check)); arr = change2jin(i); int nl = 0; int ml = 0; for (int j = 0; j < n*m; j++) { if (ml == m) { nl++; ml = 0; } dir[nl][ml] = arr[j]; ml++; } int cnt = 0; for (int i = 0; i < n; i++) { int ten = 1; for (int j = m-1; j >=0; j--) { if (dir[i][j] == 0 && check[i][j]==false) { check[i][j] = true; cnt += map[i][j] *ten; ten = ten * 10; } if (dir[i][j] == 1)ten = 1; } } for (int j = 0; j < m; j++) { int ten = 1; for (int i = n - 1; i >= 0; i--) { if (dir[i][j] == 1 && check[i][j] == false) { check[i][j] = true; cnt += map[i][j] * ten; ten = ten * 10; } if (dir[i][j] == 0)ten = 1; } } if (ans < cnt) { ans = cnt; } } cout << ans; } | cs |
'BOJ' 카테고리의 다른 글
백준 12100 / 2048 (Easy) (0) | 2019.01.29 |
---|---|
백준 1062 / 가르침 (0) | 2019.01.25 |
백준 2580 / 스도쿠 (0) | 2019.01.22 |
백준 9663 / N-Queen (0) | 2019.01.21 |
백준 1248 / 맞춰봐 (0) | 2019.01.21 |