ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SWEA 2382] 미생물 격리
    C 프로그래밍/SWEA 2022. 12. 14. 12:36
    728x90

    https://swexpertacademy.com/main/solvingProblem/solvingProblem.do

     

    SW Expert Academy

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

    swexpertacademy.com

    #include <cstdio>
    #include <cstring>
    int T;
    int N, M, K;
    
    long long int board[100 + 2][100 + 2];
    int dir[100 + 2][100 + 2];
    
    long long tmp[100 + 2][100 + 2];	// 그룹 여러개 겹칠 때	
    int tmp_dir[100 + 2][100 + 2];		// 방향 갱신
    long long MAX[100 + 2][100 + 2];	// 최댓값 저장용 
    
    // dir
    // 0 1상 2하 3좌 4우
    int dir_x[5] = { 0, -1 ,1, 0, 0 };
    int dir_y[5] = { 0, 0, 0, -1, 1 };
    int dir_op[5] = { 0, 2, 1, 4, 3 };
    
    
    
    void input()
    {
    	// init
    	memset(board, 0, sizeof(board));
    	memset(dir, 0, sizeof(dir));
    	memset(tmp, 0, sizeof(tmp));
    	memset(tmp_dir, 0, sizeof(tmp_dir));
    	memset(MAX, 0, sizeof(MAX));
    
    
    	scanf("%d %d %d", &N, &M, &K);
    	for (int k = 1; k <= K; k++) {
    		int r = 0, c = 0; long long int cnt = 0; int d = 0;
    		scanf("%d %d %lld %d", &r, &c, &cnt, &d);
    		board[r][c] = cnt;	// 미생물 개수
    		dir[r][c] = d;		// 방향 
    	}
    	//debug();
    }
    
    
    void move_groups()
    {
    	// init
    	memset(tmp, 0, sizeof(tmp));
    	memset(tmp_dir, 0, sizeof(tmp_dir));
    	memset(MAX, 0, sizeof(MAX));
    
    
    	for (int r = 0; r < N; r++) {
    		for (int c = 0; c < N; c++) {
    			if (board[r][c] == 0) continue;	// 해당 칸에 미생물 그룹 없음 
    			int p = dir[r][c];
    			int nr = r + dir_x[p];
    			int nc = c + dir_y[p];
    			long long int num = board[r][c];
    
    			if (nr == 0 || nr == N - 1 || nc == 0 || nc == N - 1) {	// 약품 있는 칸에 도달
    				if (num == 1) continue;	// 해당 그룹 사라진다 
    				num = board[r][c] / 2;
    				p = dir_op[p];
    			}
    			// 보드 정보 갱신 
    			if (tmp[nr][nc] == 0) {
    				MAX[nr][nc] = num;
    				tmp[nr][nc] = num;
    				tmp_dir[nr][nc] = p;
    			}
    			else {
    				tmp[nr][nc] += num;
    				if (MAX[nr][nc] < num) {
    					MAX[nr][nc] = num;
    					tmp_dir[nr][nc] = p;
    				}
    			}
    		}
    	}
    	memcpy(board, tmp, sizeof(tmp));
    	memcpy(dir, tmp_dir, sizeof(tmp_dir));
    }
    
    
    
    void simulation()
    {
    	for (int t = 1; t <= M; t++) {
    		move_groups();
    		//debug();
    	}
    }
    
    
    
    long long int output()
    {
    	long long int total = 0;
    
    	for (int r = 0; r < N; r++) {
    		for (int c = 0; c < N; c++) {
    			total += board[r][c];
    		}
    	}
    	return total;
    }
    
    
    
    int main()
    {
    	scanf("%d", &T);
    	for (int t = 1; t <= T; t++) {
    		input();
    		simulation();
    		long long int ans = output();
    		printf("#%d %lld\n",t, ans);
    	}
    	return 0;
    }
    728x90

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

    [SWEA 5644] 무선 충전  (0) 2022.12.14
    [SWEA 5650] 벽돌깨기  (0) 2022.12.13
    [SWEA 2819] 격자판의 숫자 이어 붙이기  (0) 2022.12.06
    [SWEA 1949] 등산로 조성  (0) 2022.11.28
    [SWEA 1210] Ladder1  (0) 2022.11.18

    댓글

Designed by Tistory.