ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SWEA 5650 : [모의 SW 역량테스트] 핀볼 게임
    백준 문제풀이/BRUTE FORCE 2020. 6. 2. 23:38

    문제


     

    문제 풀어보기

     

     

    풀이


     

    진짜 우리는 이 난독증을 어떻게 헤쳐나가야 할까.

    SWEA 문제는 안 되는 테스트 케이스 위주로 설명을 해보겠습니다.

     

     

    자신이 이것까지 확인했는지 확인해보세요.

     

    1. 블록홀과 웜홀을 없을수도 있다.

    2. 오직 빈공간에서만 시작한다.

    3. 블록의 수평수직면을 맞으면 반대방향으로 이동한다.

    4. 벽을 맞아도 점수를 얻는다 (case 3)

     

     

     

    저는 문제에 다 적혀있는걸 항상 놓치게 됩니다.

    어렸을 때 책을 많이 읽으라는게

    괜히 하는 소리가 아닌가 봅니다.

     

    코드


    #include <iostream>
    #include <vector>
    #include <queue>
    #include <algorithm>
    #include <map>
    #include <cstdio>
    
    using namespace std;
    #define safe(x,y) (x>=n || x<0 || y<0 || y>=n)
    
    int dx[] = { 1,-1 ,0,0 };
    int dy[] = { 0,0,1,-1 };
    //아래 위 오른쪽 왼쪽
    
    //int dx[] = { -1, 1, 1, -1 };
    //int dy[] = { 1, 1, -1 , -1 };
    // 대각선
    
    int n;
    int arr[101][101];
    int ans ;
    
    int reverse(int d) {
    	if (d % 2 == 0) return d + 1;
    	else  return d - 1;	
    }
    
    void simulation(int a, int b, vector<pair<int, int>> holl1
    , vector<pair<int, int>> holl2) {
    
    	for (int k = 0; k < 4; k++) {
    		int nx = a;
    		int ny = b;
    		int d = k;
    		int score = 0;
    		while (true) {
    
    			while (true) {
    				nx += dx[d];
    				ny += dy[d];
    				// 벽
    				if ( safe(nx, ny) ) {
    					score += 1;
    					d = reverse(d);
    					nx += dx[d];
    					ny += dy[d];
    				}
    				if ((nx == a && ny == b) || arr[nx][ny] != 0) break;
    			}
    
    
    
    			int pinball = arr[nx][ny];
    			if ((nx == a && ny == b) || pinball == -1) {
    				// 제자리 or 블랙홀
    
    
    				if (score > ans) ans = score;
    				break;
    			}
    			
    			// 블록
    			//아래 위 오른쪽 왼쪽
    			int nowD = d;
    			if (pinball == 1) {
    				if (d == 0) d = 2;
    				else if (d == 3) d = 1;
    				else d = reverse(d);
    			}
    			else if (pinball == 2) {
    				if (d == 1) d = 2;
    				else if (d == 3) d = 0;
    				else d = reverse(d);
    			}
    			else if (pinball == 3) {
    				if (d == 1) d = 3;
    				else if (d == 2) d = 0;
    				else d = reverse(d);
    			}
    			else if (pinball == 4) {
    				if (d == 2) d = 1;
    				else if (d == 0) d = 3;
    				else d = reverse(d);
    			}
    			else if (pinball == 5) {
    				d = reverse(d);
    			}
    			if (nowD != d) score += 1;
    
    			// wormholl
    			if (pinball >= 6 && pinball <= 10) {
    				auto worm1 = holl1[pinball - 6];
    				if (nx == worm1.first && ny == worm1.second) {
    					nx = holl2[pinball - 6].first;
    					ny = holl2[pinball - 6].second;
    				}
    				else {
    					nx = holl1[pinball - 6].first;
    					ny = holl1[pinball - 6].second;
    				}
    
    
    			}
    
    		}
    
    	}
    }
    
    int main() {
    	ios::sync_with_stdio(false);
    	cin.tie(NULL);
    	
    	int T;
    	cin >> T;
    
    	for (int test = 1; test <= T; test++) {
    
    		cin >> n;
    		vector<pair<int, int>> holl1(5);
    		vector<pair<int, int>> holl2(5);
    		vector<bool> hollCheck(5,false);
    		for (int i = 0; i < n; i++) {
    			for (int j = 0; j < n; j++) {
    				cin >> arr[i][j];
    				if (arr[i][j] > 5) {
    					if (hollCheck[arr[i][j] - 6]) {
    						holl2[arr[i][j] - 6] = { i,j };
    					}
    					else {
    						holl1[arr[i][j] - 6] = { i,j };	
    						hollCheck[arr[i][j] - 6] = true;
    					}
    				}
    			}
    		}
    		ans = 0;
    		for (int i = 0; i < n; i++) {
    			for (int j = 0; j < n; j++) {
    				if (arr[i][j] == 0) {
    					simulation(i, j, holl1, holl2);
    				}
    			}
    		}
    
    		cout << "#" << test << ' ';
    		cout << ans << endl;
    
    
    	}
    
    
    
    
    	return 0;
    }

     

    댓글

Designed by Tistory.