알고리즘/백준
백준 14500 테트로미노 삼성 SW 역량 테스트 기출 문제 c++
이영재의오른발
2022. 7. 6. 16:14
반응형
https://www.acmicpc.net/problem/14500
14500번: 테트로미노
폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변
www.acmicpc.net
문제 이해 후 구상하는데만 20분 구현에는 두시간이 걸렸다.
첫 구상때는 경우의수를 전부 나눠보려고 했는데 그렇게하면 20가지가 넘는 경우의 수가 나오게돼서 하루를 전부 구현해도 안나올 경우의 수였다.
그래서 다시한번 생각을 해보니 ㅗ 모양을 제외한 나머지 케이스는 dfs를 이용했을때 깊이가 3인 것들이었다.
가로 세로의 길이가 최대 500x500 이기에 행렬의 원소 한개씩 브루트포스를 해서 구해도 문제가 없다고 생각해 백트래킹을 이용한 브루트포스를 구현했다.
#include <iostream>
#include <vector>
#include <algorithm>
#include<cstring>
using namespace std;
int result = 0;
int v[501][501];
int check[501][501];
int n,m;
int dx[] = {-1,1,0,0};
int dy[] = {0,0,-1,1};
void dfs(int x,int y,int cnt,int sum)
{
if(cnt == 4) {
if(result < sum) {
result = sum;
}
return;
}
for(int i=0; i<4; i++) {
int nx = dx[i] + x;
int ny = dy[i] + y;
if(nx < 1 || ny < 1 || nx > n || ny > m || check[nx][ny]) continue;
check[nx][ny] = 1;
dfs(nx,ny,cnt+1,sum+v[nx][ny]);
check[nx][ny] = 0;
}
if(x-1>=1 && y-1>=1 && x+1<=n) {
result = max(result,(v[x-1][y] + v[x][y-1] + v[x][y] + v[x+1][y]));
}
if(x-1>=1 && y+1<=m && x+1<=n) {
result = max(result,(v[x-1][y] + v[x][y+1] + v[x][y] + v[x+1][y]));
}
if(y-1>=1 && x+1<=n && y+1<=m) {
result = max(result,(v[x][y] + v[x+1][y] + v[x+1][y+1] + v[x+1][y-1]));
}
if(y-1>=1 && x+1<=n && y+1<=m) {
result = max(result,(v[x][y-1] + v[x][y] + v[x][y+1] + v[x+1][y]));
}
}
int main(void)
{
cin >> n >> m;
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
cin >> v[i][j];
}
}
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
check[i][j] = 1;
dfs(i,j,1,v[i][j]);
check[i][j] = 0;
}
}
cout << result;
return 0;
}
ㅗ의 경우는 ㅗ,ㅜ,ㅏ,ㅓ 네가지 경우를 따로 구현해주면 된다.
728x90
반응형