ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SWEA 5648] 원자 소멸 시뮬레이션
    C 프로그래밍/SWEA 2022. 11. 17. 13:54
    728x90

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

     

    SW Expert Academy

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

    swexpertacademy.com

    #include <cstdio>
    #include <cstring>
    int T;
    int N;
    struct _st
    {
    	int x, y;
    	int dir;
    	int k;
    	bool alive;
    }Atom[1000 + 2];
    int energy;
    
    int visited[4000 + 2][4000 + 2];
    bool collision[4000 + 2][4000 + 2];
    
    
    void init()
    {
    	memset(Atom, 0, sizeof(Atom));
    	memset(visited, 0, sizeof(visited));
    	memset(collision, 0, sizeof(collision));
    	energy = 0;
    }
    
    
    void input()
    {
    	scanf("%d", &N);
    	for (int i = 1; i <= N; i++) {
    		scanf("%d %d %d %d", &Atom[i].x, &Atom[i].y, &Atom[i].dir, &Atom[i].k);
    		Atom[i].x += 1000;	// 좌표값에 1000을 더해 음이 아닌 정수로 만들어준다. 
    		Atom[i].y += 1000;
    		Atom[i].x *= 2;		// 모든 원자들의 위치를 2배로 늘려 원자들이 정수값을 가지는 좌표에서 충돌이 나도록 할 수 있다. 
    		Atom[i].y *= 2;
    		Atom[i].alive = true;
    		visited[Atom[i].x][Atom[i].y] = 1;
    	}
    }
    
    
    void move_atom()
    {
    	for (int i = 1; i <= N; i++) {
    		if (Atom[i].alive == false) continue;
    		int x = Atom[i].x;
    		int y = Atom[i].y;
    		int dir = Atom[i].dir;
    		visited[x][y] -= 1;
    
    		int nx = x;
    		int ny = y;
    		if (dir == 0) ny++;
    		else if (dir == 1) ny--;
    		else if (dir == 2) nx--;
    		else if (dir == 3) nx++;
    
    		if (nx < 0 || nx > 4000 || ny < 0 || ny > 4000) {	// 원자가 보드 밖을 벗어나면 어차피 충돌 못한다. 
    			Atom[i] = { -1, -1, -1, -1, false };
    			continue;
    		}
    		else {
    			visited[nx][ny] += 1;
    			Atom[i] = { nx, ny, dir, Atom[i].k, true };
    			if (visited[nx][ny] >= 2) collision[nx][ny] = true;
    		}
    	}
    }
    
    
    void is_collision()
    {
    	for (int i = 1; i <= N; i++) {
    		if (Atom[i].alive == false) continue;
    		int x = Atom[i].x;
    		int y = Atom[i].y;
    
    		if (collision[x][y] == true) {
    			if (visited[x][y] == 1) collision[x][y] = false;
    			visited[x][y] -= 1;
    			energy += Atom[i].k;
    			Atom[i] = { -1, -1, -1, -1, false };
    		}
    	}
    }
    
    
    
    bool chk_atom()
    {
    	for (int i = 1; i <= N; i++) {
    		if (Atom[i].alive == true) return false;
    	}
    	return true;	
    }
    
    
    void simul()
    {
    	while (1) {
    		move_atom();
    		is_collision();
    		if (chk_atom()) return;
    	}
    }
    
    
    int main()
    {
    	scanf("%d", &T);
    	for (int t = 1; t <= T; t++) {
    		init();
    		input();
    		simul();
    		printf("#%d %d",t, energy);
    	}
    	return 0;
    }
    728x90

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

    [SWEA 1210] Ladder1  (0) 2022.11.18
    [SWEA 1249] 보급로  (0) 2022.11.17
    [SWEA 1954] 달팽이 숫자  (0) 2022.11.17
    [SWEA 2805] 농작물 수확하기  (0) 2022.11.17
    [SWEA 1974] 스도쿠 검증  (0) 2022.11.17

    댓글

Designed by Tistory.