/*
reference: https://kimth1130cr.blog.me/221144277234
My own code has the same logic, but use vector instead of array.
However it has errors, so I refered to the above link.
*/
#include <iostream>
using namespace std;
struct myCore {
int x, y;
};
myCore core[12];
int map[12][12];
int dir[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};
int N,core_count;
int core_max, line_min;
int cirsum(int cmap[12][12]) {
int result = 0;
for (int i=0; i<N; i++) {
for (int j=0;j<N;j++) {
if (cmap[i][j] == 2) result++;
}
}
return result;
}
//cnum : 현재 선택한 코어번호.
//core_cur : 현재 연결 성공한 코어 개수
void solve(int cnum, int cmap[12][12], int core_cur) {
if (cnum >= core_count) {
if(core_cur > core_max) {
core_max = core_cur;
line_min = cirsum(cmap);
}
else if( core_cur == core_max) {
line_min = min(line_min,cirsum(cmap));
}
return;
}
for (int d = 0; d<4; d++) {
int cur_x = core[cnum].x;
int cur_y = core[cnum].y;
bool connect = true;
int cnt = 0;
while(1) {
cur_x += dir[d][0];
cur_y += dir[d][1];
if (cur_x <0 || cur_x>=N || cur_y<0 || cur_y>=N)
break;
if(cmap[cur_x][cur_y] != 0){
connect = false;
break;
}
cmap[cur_x][cur_y] = 2;
cnt++;
}
if(connect) {
solve(cnum+1,cmap,core_cur+1);
}
cur_x = core[cnum].x + dir[d][0];
cur_y = core[cnum].y + dir[d][1];
for(int i = 0; i<cnt; i++, cur_x+=dir[d][0],cur_y+=dir[d][1])
cmap[cur_x][cur_y] = 0;
}
solve(cnum+1,cmap,core_cur);
}
int main() {
int T;
cin >> T;
for(int k=1; k<=T; k++) {
cin >> N;
core_count = 0;
core_max = -1;
line_min = 200;
for (int i=0;i<N;i++) {
for (int j=0;j<N;j++) {
int input;
cin >> input;
map[i][j] = input;
if(input == 1) {
if (i == 0 || i == N - 1 || j == 0 || j == N - 1) continue;
else {
core[core_count].x = i;
core[core_count].y = j;
core_count++;
}
}
}
}
solve(0,map,0);
cout << "#" << k << " " <<line_min << endl;
}
return 0;
}
댓글 없음:
댓글 쓰기