14391번: 종이 조각
영선이는 숫자가 쓰여 있는 직사각형 종이를 가지고 있다. 종이는 1×1 크기의 정사각형 칸으로 나누어져 있고, 숫자는 각 칸에 하나씩 쓰여 있다. 행은 위에서부터 아래까지 번호가 매겨져 있고,
www.acmicpc.net
백트래킹, 브루트 포스
[백준 1799] 비숍 C++
1799번: 비숍 첫째 줄에 체스판의 크기가 주어진다. 체스판의 크기는 10이하의 자연수이다. 둘째 줄부터 아래의 예와 같이 체스판의 각 칸에 비숍을 놓을 수 있는지 없는지에 대한 정보가 체스판
hyeo-noo.tistory.com
[백준 17136] 색종이 붙이기 C++
과 같이 정사각형 모양을 한 다섯 종류의 색종이가 있다. 색종이의 크기는 1×1, 2×2, 3×3, 4×4, 5×5로 총 다섯 종류가 있으며, 각 종류의 색종이는 5개씩 가지고 있다. <그림 1> 색종이를 크" data-og-ho
hyeo-noo.tistory.com
위 두 문제들이랑 결이 비슷하다. 특히 비숍
현재 열이 M에 도달하면 다음 행, 0번 열으로 이동하는 방식과 현재 칸에 비숍을 놓을지 말지를 결정하기 위해 사용한 대각선 배열의 느낌이 비슷하다.
각각의 칸에 O를 넣을지 X를 넣을지 정해보자
O가 들어간 칸들은 가로로 더해주고, X가 들어간 칸들은 세로로 더해준다.
이렇게 모든 칸을 o, x 작업을 마치고 가로와 세로의 연속된 숫자들을 잘 더해주면 현재 트래킹 상태에서의 합을 구할 수 있다. 이렇게 최대 2^16번 구하면 최대값을 구할 수 있다.
처음에 가로, 세로를 구분하고 1x1칸도 생각해줘야 하나 했지만 어차피 1x1은 가로 세로에 포함될 수 있기 때문에 신경쓸 필요가 없다고 생각했다.
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
|
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <cstring>
#define fasti ios_base::sync_with_stdio(false); cin.tie(0);
#define fastio ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define INF 1e9+7
#define pii pair<int, int>
typedef long long ll;
// typedef pair<int, int> pii;
using namespace std;
int N, M;
int Map[5][5];
bool visited[5][5];
int ans;
void input(){
cin >> N >> M;
string str;
for(int r = 0; r < N; r++){
cin >> str;
for(int c = 0; c < M; c++){
Map[r][c] = str[c] - '0';
}
}
}
void dfs(int r, int c){
if(r == 4){
int sum = 0;
for(int r = 0; r < N; r++){
int temp = 0;
for(int c = 0; c < M; c++){
if(visited[r][c]) temp = temp*10 + Map[r][c];
else{
sum += temp;
temp = 0;
}
}
sum += temp;
}
for(int c = 0; c < M; c++){
int temp = 0;
for(int r = 0; r < N; r++){
if(!visited[r][c]) temp = temp*10 + Map[r][c];
else{
sum += temp;
temp = 0;
}
}
sum += temp;
}
ans = max(ans, sum);
return;
}
if(c == 4){
dfs(r+1, 0);
return;
}
visited[r][c] = true;
// 가로로 이어짐
dfs(r, c+1);
visited[r][c] = false;
// 세로로 이어짐
dfs(r, c+1);
}
void solve(){
dfs(0, 0);
cout << ans << "\n";
}
int main(){
input();
solve();
return 0;
}
|
cs |
'Algorithm > BOJ' 카테고리의 다른 글
[백준 2026] 소풍 (C++) (0) | 2021.08.04 |
---|---|
[백준 14284] 간선 이어가기 2 (C++) (0) | 2021.08.04 |
[백준 2243] 사탕상자 (C++) (0) | 2021.08.03 |
[백준 13308] 주유소 (C++) (0) | 2021.08.02 |
[백준 11377] 열혈강호 3 (C++) (0) | 2021.08.02 |