2018년 4월 11일 수요일

[C++] Samsung SW Expert Academy 1767. [SW Test 샘플문제] 프로세서 연결하기

/*
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;
}

댓글 없음:

댓글 쓰기