어흥

[백준 14391] 종이 조각 (C++) 본문

알고리즘/백준

[백준 14391] 종이 조각 (C++)

라이언납시오 2020. 9. 5. 11:52
728x90
반응형

문제 링크: www.acmicpc.net/problem/14391

 

14391번: 종이 조각

영선이는 숫자가 쓰여 있는 직사각형 종이를 가지고 있다. 종이는 1×1 크기의 정사각형 칸으로 나누어져 있고, 숫자는 각 칸에 하나씩 쓰여 있다. 행은 위에서부터 아래까지 번호가 매겨져 있고,

www.acmicpc.net

 

1. 주의할 점

- 최대 4*4이므로, 브루트포스 알고리즘을 사용한다

- 사용한 숫자처리를 제대로 하면 된다

 

2. 구현

- 배열을 입력받은 후, 왼쪽위 원소부터 브루트포스를 수행한다

- 브루트포스는 다음과 같은 순서로 진행된다. 해당 원소만 포함, 해당 원소포함 + 아래숫자들 포함, 해당 원소포함 + 오른쪽 숫자들 포함

- 단, 위의 기준은 항상 추가할 숫자가 방문처리되어 있지 않다는 가정하에 진행한다.

- 해당 원소를 기준으로 위의 3가지 조건 중 1개를 수행했을 경우, 다음 브루포스 함수 호출은 항상 Brute(Num+1, Sum+Val)로 한다. 이에 따라, 2번째 조건인 해당 원소포함 + 아래숫자들 포함 을 수행할 경우, Check[][]배열을 확인하지 않아도 된다는 사실 또한 알 수 있다(이해 안가면 구현한 로직이 어떤 방식으로 작동하는지 파악해보세요)

 

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int arr[4][4];
bool check[4][4] = { false, };
int row, col, result = 0;

void brute(int num, int sum) {
	int x = num % col;
	int y = num / col;
	if (num >= row * col) {
		result = max(result, sum);
		return;
	}
	if (check[y][x]) brute(num + 1, sum);
	else {
		int val, ny, nx;
		val = arr[y][x];
		check[y][x] = true;
		brute(num + 1, sum + val);
		check[y][x] = false;
		//밑으로
		for (int k = 1; k < row - y; k++) {
			nx = x;
			ny = y + k;
			val *= 10;
			val += arr[ny][nx];
			for (int j = 1; j <= k; j++)
				check[y + j][nx] = true;
			brute(num + 1, sum + val);
			for (int j = 1; j <= k; j++)
				check[y + j][nx] = false;
		}
		val = arr[y][x];
		//오른쪽으로
		for (int k = 1; k < col - x; k++) {
			ny = y;
			nx = x + k;
			if (check[ny][nx]) return;
			val *= 10;
			val += arr[ny][nx];
			for (int j = 1; j <= k; j++)
				check[ny][x+j] = true;
			brute(num + 1, sum + val);
			for (int j = 1; j <= k; j++)
				check[ny][x + j] = false;
		}
	}
}

int main() {
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	cin >> row >> col;
	string str;
	for (int i = 0; i < row; i++) {
		cin >> str;
		for (int j = 0; j < col; j++)
			arr[i][j] = str[j] - '0';
	}
	brute(0, 0);
	cout << result;
	return 0;
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 2143] 두 배열의 합 (C++)  (0) 2020.09.08
[백준 13422] 도둑 (C++)  (0) 2020.09.08
[백준 16971] 배열 B의 값 (C++)  (0) 2020.09.02
[백준 1904] 01타일 (C++)  (0) 2020.08.30
[백준 16562] 친구비 (C++)  (0) 2020.08.27
Comments