본문 바로가기
이것저것

SW 4013 특이한 자석 소스코드

by 문자메일 2018. 4. 8.

/*

1. 배열 정보 정상 입력 확인

2. rotate 함수 정상 작동 확인

*/

#include <stdio.h>


void solve(int num, int dir);

void rotate(int num, int dir);

void init();


int arr[5][9];

int rotateArr[101][3]; //회전 저장 

int visit[5];

int T;

int K;

int score;



int main()

{

scanf("%d", &T);


for (int tc = 1; tc <= T; tc++){


init();

scanf(" %d", &K);

//0행 0열 제외하고 톱니 배열 입력

for (int i = 1; i <= 4; i++){

for (int j = 1; j <= 8; j++){

scanf(" %1d", &arr[i][j]);

}

}


//0행, 0열 제외하고 회전 정보 저장

for (int i = 1; i <= K; i++){

for (int j = 1; j <= 2; j++){

scanf(" %d", &rotateArr[i][j]);

}

}



for (int i = 1; i <= K; i++){

solve(rotateArr[i][1], rotateArr[i][2]);

visit[1] = 0; visit[2] = 0; visit[3] = 0; visit[4] = 0;

}


//rotate(1, -1);


///*배열 정상 입력 체크 완료*/

//for (int i = 1; i <= 4; i++){

// for (int j = 1; j <= 8; j++){

// //printf("%d ", rotateArr[i][j]);

// printf("%d ", arr[i][j]);

// }

// printf("\n");

//}


//점수 계산

for (int i = 1; i <= 4; i++){

//S극이 1이다.

if (arr[i][1] == 1){

score += 1 << i - 1;

}

}

printf("#%d %d\n", tc,score);

}

return 0;

}


void solve(int num, int dir){

//톱니 방문 체크

visit[num] = 1; 


//바퀴를 회전한다.

rotate(num, dir);

int naver1, naver2;

naver1 = num - 1, naver2 = num + 1;


//기준의 왼쪽 톱니

if (naver1 >= 1 && visit[naver1] == 0){

//이웃한 톱니가 다른 극이라면, 해당 톱니 기존과 반대 방향으로 회전

if (arr[naver1][3] != arr[num][7 + dir]){

solve(naver1, dir*(-1));

}

}

//기준의 오른쪽 톱니

if (naver2 <= 4 && visit[naver2] == 0){

//이웃한 톱니가 다른 극이라면, 해당 톱니 기존과 반대 방향으로 회전

if (arr[num][3 + dir] != arr[naver2][7]){

solve(naver2, dir*(-1));

}

}

}


//dir 1 : 시계방향

//dir 2 : 반시계방향

void rotate(int num, int dir){


//기존 톱니번호 저장

int tempArr[9] = { 0, };

for (int i = 1; i <= 8; i++)

tempArr[i] = arr[num][i];


switch (dir){

//시계방향 회전

case 1:

for (int i = 1; i <= 7; i++){

arr[num][i + 1] = tempArr[i];

}

arr[num][1] = tempArr[8];

break;

//반시계방향 회전

case -1:

for (int i = 7; i >= 1; i--){

arr[num][i] = tempArr[i + 1];

}

arr[num][8] = tempArr[1];

break;

}

}


void init()

{

for (int i = 1; i <= 4; i++){

for (int j = 1; j <= 8; j++){

arr[i][j] = 0;

}

}


//0행, 0열 제외하고 회전 정보 저장

for (int i = 1; i <= K; i++){

for (int j = 1; j <= 2; j++){

rotateArr[i][j] = 0;

}

}

score = 0;

}

'이것저것' 카테고리의 다른 글

백준 2146 다리만들기  (0) 2018.04.14
SW 2477 차량 정비소 문제  (0) 2018.04.12
SW 3304 최장공통부분수열 [D3]  (0) 2018.04.02
백준 2178 미로탐색  (0) 2018.04.01
SW 4050 재광이의 대량 할인 [D4]  (0) 2018.03.30

댓글