#include <iostream>
#include<cstdio>
#define MAX 17
#define INT_MAX 2147483647
using namespace std;
int T,N,W,H;
int map[MAX][MAX];
int ans;
int dr[] = { 0, -1, 0, 1 };
int dc[] = { -1, 0, 1, 0 };
void input(int w, int h)
{
for (int i = 1; i <= h; i++)
{
for (int j = 1; j <= w; j++)
{
scanf("%d", &map[i][j]);
}
}
}
int rest_rocks(int t_map[MAX][MAX])
{
int cnt=0;
for (int i = 1; i <= H; i++)
{
for (int j = 1; j <= W; j++)
{
if (t_map[i][j])
cnt++;
}
}
return cnt;
}
int get_high_row(int tmap[MAX][MAX], int col)
{
for (int i = 1; i <= H; i++)
{
if (tmap[i][col])
return i;
}
return -1;
}
void copy_map(int tmap[MAX][MAX], int Map[MAX][MAX])
{
for (int i = 1; i <= H; i++)
{
for (int j = 1; j <= W; j++)
{
tmap[i][j] = Map[i][j];
}
}
}
void bomb(int t_map[MAX][MAX], int row, int col, int num)
{
t_map[row][col] = 0;
if (num == 1)
{
t_map[row][col] = 0;
return;
}
for (int i = 1; i < num; i++)
{
for (int j = 0; j < 4; j++)// 상하좌우
{
int nr = row + (i * dr[j]);
int nc = col + (i * dc[j]);
if (nr > H || nr < 1)
continue;
if (nc > W || nc < 1)
continue;
int n_num = t_map[nr][nc];
t_map[nr][nc] = 0;
if (n_num > 1)
{
bomb(t_map, nr, nc, n_num);
}
}
}
}
void re_arrange(int t_map[MAX][MAX])
{
int n_map[MAX][MAX] ={0, };
for (int i = 1; i <= W; i++)
{
int n_r = H;
for (int j = H; j >=1; j--)
{
if (t_map[j][i])
{
n_map[n_r--][i] = t_map[j][i];
}
}
}
copy_map(t_map, n_map);
}
void dfs(int lev, int Map[MAX][MAX])
{
if (lev == N)
{
int t_rocks = rest_rocks(Map);
if (ans > t_rocks)
{
ans = t_rocks;
}
return;
}
for (int i = 1; i <= W; i++)
{
int h_row = get_high_row(Map, i);
if (h_row == -1)
{
dfs(lev + 1, Map);
continue;
}
else
{
int t_map[MAX][MAX] = { 0, };
copy_map(t_map, Map);
bomb(t_map, h_row, i, t_map[h_row][i]);
re_arrange(t_map);
dfs(lev + 1, t_map);
}
}
}
void init_map()
{
for (int i = 0; i < MAX; i++)
{
for (int j = 0; j < MAX; j++)
{
map[i][j] = 0;
}
}
}
int main() {
scanf("%d", &T);
for (int i = 0; i < T; i++)
{
ans = INT_MAX;
init_map();
N = 0; W = 0; H = 0;
scanf("%d %d %d", &N, &W, &H);
input(W, H);
dfs(0, map);
printf("#%d %d\n", i + 1, ans);
}
return 0;
}
처음에 nr 과 nc의 범위 설정을 안해줘서 오류가 났다. 아래 부분을 추가하니 pass 됐다.
if (nr > H || nr < 1)
continue;
if (nc > W || nc < 1)
continue;
dfs로 완전탐색을 했다.
728x90
'코테 > SW Expert Academy' 카테고리의 다른 글
4014. [모의 SW 역량테스트] 활주로 건설 (0) | 2022.04.30 |
---|---|
6109. 추억의 2048게임 (0) | 2022.04.28 |
13475. 동선 추적 (2) | 2022.02.20 |
4408. 자기 방으로 돌아가기 (0) | 2022.02.08 |
1230. [S/W 문제해결 기본] 8일차 - 암호문3 (0) | 2022.02.05 |