ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SWEA 5650] 핀볼 게임
    C 프로그래밍/SWEA 2022. 10. 5. 20:43
    728x90

    https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRF8s6ezEDFAUo 

     

    SW Expert Academy

    SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

    swexpertacademy.com

    #include <cstdio>
    #include <cstring>
    int T;
    int N;
    int board[100 + 2][100 + 2];
    int ans;
    
    
    struct _wt
    {
    	int x, y;
    }WH[10 + 2][2];
    
    int Blocks[6][4] = {
       {},
       // 0상 1하 2좌 3우
       {1, 3, 0, 2},   //1
       {3, 0, 1, 2},   //2
       {2, 0, 3, 1},   //3
       {1, 2, 3, 0},   //4
       {1, 0, 3, 2}   //5
    };
    
    
    void input()
    {
    	// init
    	memset(board, 0, sizeof(board));
    	memset(WH, 0, sizeof(WH));
    	ans = 0;
    
    	scanf("%d", &N);
    	for (int i = 1; i <= N; i++) {
    		for (int j = 1; j <= N; j++) {
    			scanf("%d", &board[i][j]);
    			if (board[i][j] >= 6) {
    				if (WH[board[i][j]][0].x == 0 && WH[board[i][j]][0].y == 0) WH[board[i][j]][0] = { i, j };
    				else WH[board[i][j]][1] = { i, j };
    			}
    		}
    	}
    }
    
    void make_bound()
    {
    	for (int i = 0; i <= N + 1; i++) {
    		board[0][i] = 5;
    		board[N + 1][i] = 5;
    		board[i][0] = 5;
    		board[i][N + 1] = 5;
    	}
    }
    
    
    int play_game(int sx, int sy, int d)
    {
    	// dir
    	// 0상 1하 2좌 3우
    	int dir_x[4] = { -1, 1, 0, 0 };
    	int dir_y[4] = { 0, 0 , -1, 1 };
    
    	int x = sx;
    	int y = sy;
    	int score = 0;
    
    	while (1) {
    		int nx = x + dir_x[d];
    		int ny = y + dir_y[d];
    
    		if (nx == sx && ny == sy) return score;
    
    		// 블랙홀 만났을 때 
    		if (board[nx][ny] == -1) return score;
    		// 블럭만났을 때 
    		else if (board[nx][ny] >= 1 && board[nx][ny] <= 5) {
    			score++;
    			int nd = Blocks[board[nx][ny]][d];
    			x = nx, y = ny;
    			d = nd;
    			continue;
    		}
    		// 웜홀 만났을 때 
    		else if (board[nx][ny] >= 6) {
    			if (nx == WH[board[nx][ny]][0].x && ny == WH[board[nx][ny]][0].y) {
    				x = WH[board[nx][ny]][1].x;
    				y = WH[board[nx][ny]][1].y;
    				continue;
    			}
    			else {
    				x = WH[board[nx][ny]][0].x;
    				y = WH[board[nx][ny]][0].y;
    				continue;
    			}
    		}
    		// 빈칸일 때
    		else {
    			x = nx, y = ny;
    		}
    	}
    }
    
    
    
    void search_all()   // 모든 칸에서 시작해본다. 
    {
    	for (int i = 1; i <= N; i++) {
    		for (int j = 1; j <= N; j++) {
    			if (board[i][j] != 0) continue;   // 블럭, 블랙홀, 웜홀에서는 시작하지 않음
    			for (int p = 0; p < 4; p++) {   // 같은 출발점에서 4방향으로 시작해봄
    				int res = play_game(i, j, p);
    				if (res > ans) ans = res;
    			}
    		}
    	}
    }
    
    
    int main()
    {
    	scanf("%d", &T);
    	for (int t = 1; t <= T; t++) {
    		input();
    		make_bound();
    		search_all();
    		printf("#%d %d\n", t, ans);
    	}
    	return 0;
    }

    주의해야 하는 포인트들 

    1. 웜홀 좌표 저장 시, 같은 열 혹은 같은 행에 있는 경우 있을 수 있다. 

    따라서 x좌표 혹은 y좌표 한 개만 확인해주는 것이 아니라, 둘 다 확인해 주어야 한다. 

     

    2. ans 초기화 

    맵에 빈칸이 아예 없어서 play_game() 함수를 호출하지 못하는 경우가 있을 수 있다. 

    이 경우 ans 값을 -1로 초기화 한 경우 0으로 바뀌지 않기 때문에 -1 이라는 틀린 값을 출력한다. 

    특정 변수를 초기화할 때, 어떤 값으로 초기화해야하는지 항상 생각하면서 문제를 풀자 . 

     

    728x90

    'C 프로그래밍 > SWEA' 카테고리의 다른 글

    [SWEA 6808] 규영이와 인영이의 카드게임  (0) 2022.11.04
    [SWEA 5653] 줄기세포 배양  (0) 2022.10.15
    [SWEA 2112] 보호 필름  (0) 2022.10.12
    [SWEA 1953] 탈주범 검거  (0) 2022.10.11
    [SWEA 1954] 달팽이 숫자  (0) 2022.08.18

    댓글

Designed by Tistory.