시뮬레이션 + DFS 문제입니다.
가능한 모든 경우의 수를 재귀적으로 계산하여 결과값 Ans를 갱신하는 방식으로 풀었습니다.
//SWEA 2112
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
#define INF 2e9
#define PURE -1
#define A 0
#define B 1
int D, W, K;
int Ans;
int Layer[14][21]; //두꼐 3~13, 가로크기 1~20
int BULayer[14][21];
void Backup(int col)
{
for (int j = 0; j < W; j++)
{
BULayer[col][j] = Layer[col][j];
}
}
void Restore(int col)
{
for (int j = 0; j < W; j++)
{
Layer[col][j] = BULayer[col][j];
}
}
bool IsPass()
{
for (int j = 0; j < W; j++)
{
int cnt = 1;
int tmp = Layer[0][j];
for (int i = 1; i < D; i++)
{
if (cnt >= K)
{
break;
}
if (tmp == Layer[i][j])
{
cnt += 1;
}
else
{
cnt = 1;
tmp = Layer[i][j];
}
}
if (cnt < K)
{
return false;
}
}
return true;
}
void SolveDFS(int type, int dcnt, int lcnt)
{
if (dcnt >= Ans) //pruning
{
return;
}
if (lcnt == D)
{
if (IsPass()) //검수 기준에 통과하는지 체크
{
Ans = min(Ans, dcnt); //통과한다면 Ans 최소값으로 갱신
}
return;
}
Backup(lcnt); //막의 현재 층만 백업
if (type == A || type == B)
{
for (int i = 0; i < W; i++)
{
Layer[lcnt][i] = type;
}
}
SolveDFS(PURE, dcnt, lcnt + 1);
SolveDFS(A, dcnt + 1, lcnt + 1);
SolveDFS(B, dcnt + 1, lcnt + 1);
Restore(lcnt); //막의 현재 층만 복원
}
void SolveAll()
{
SolveDFS(PURE, 0, 0);
SolveDFS(A, 1, 0);
SolveDFS(B, 1, 0);
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int t;
cin >> t;
for (int tc = 1; tc <= t; tc++)
{
Ans = INF;
memset(Layer, 0, sizeof(Layer));
memset(BULayer, 0, sizeof(BULayer));
cin >> D >> W >> K;
for (int i = 0; i < D; i++)
{
for (int j = 0; j < W; j++)
{
cin >> Layer[i][j];
}
}
SolveAll();
cout << "#" << tc << " " << Ans << "\n";
}
return 0;
}
'개발 > 알고리즘 & 자료구조' 카테고리의 다른 글
백준(BOJ) 1406번 에디터 (0) | 2021.08.02 |
---|---|
백준(BOJ) 11728번 배열 합치기 (0) | 2021.08.02 |
비트마스크(Bitmask) (0) | 2021.08.02 |
O(n+k) 정렬 - 카운팅 정렬(Counting Sort) (0) | 2021.08.02 |
O(n^2) 정렬 - 선택정렬(SelectionSort) (0) | 2021.08.02 |