ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준 17837] 새로운 게임 2
    C 프로그래밍/BOJ 2022. 10. 10. 15:31
    728x90

    메! 정신을 똑바로 차리고 풀어야 한단 말이야

    https://www.acmicpc.net/problem/17837

     

    17837번: 새로운 게임 2

    재현이는 주변을 살펴보던 중 체스판과 말을 이용해서 새로운 게임을 만들기로 했다. 새로운 게임은 크기가 N×N인 체스판에서 진행되고, 사용하는 말의 개수는 K개이다. 말은 원판모양이고, 하

    www.acmicpc.net

    #include <cstdio>
    #include <vector>
    #include <algorithm>
    int N, K;
    int board[12 + 2][12 + 2];
    std::vector<int> Chess[12 + 2][12 + 2];	// 말 쌓아놓음 
    
    struct _ht
    {
    	int idx;	// 벡터의 몇번째 위치에 있는지 
    	int x, y;
    	int dir;
    };
    _ht Horse[10 + 2];
    
    
    
    void input()
    {
    	scanf("%d %d", &N, &K);
    	for (int i = 1; i <= N; i++) {
    		for (int j = 1; j <= N; j++) {
    			scanf("%d", &board[i][j]);
    		}
    	}
    	for (int i = 1; i <= K; i++) {
    		int r = 0, c = 0, d = 0;
    		scanf("%d %d %d", &r, &c, &d);
    		Horse[i] = { 0, r, c, d };
    		Chess[r][c].push_back(i);
    	}
    }
    
    
    void make_bound()
    {
    	for (int n = 0; n <= N + 1; n++) {
    		board[n][N + 1] = 2;
    		board[n][0] = 2;
    		board[N + 1][n] = 2;
    		board[0][n] = 2;
    	}
    }
    
    
    bool play_game()
    {
    	//  →, ←, ↑, ↓
    	static int dir_x[5] = { 0, 0, 0, -1, 1 };
    	static int dir_y[5] = { 0, 1, -1, 0, 0 };
    	static int dir_op[5] = { 0, 2, 1, 4, 3 };
    
    	for (int h = 1; h <= K; h++) {
    		bool set = false;
    		bool blue = false;
    		for (int d = 0; d <= 1; d++) {
    			if (set == true) break;
    			int idx = Horse[h].idx;
    			int x = Horse[h].x;
    			int y = Horse[h].y;
    			int dir = Horse[h].dir;
    
    			int nx = x + dir_x[dir];
    			int ny = y + dir_y[dir];
    			int size = Chess[x][y].size();
    
    			// 흰색
    			if (board[nx][ny] == 0) {
    				int moved = 0;
    				for (int i = idx; i < size; i++) {
    					int horse = Chess[x][y][i];
    					Chess[nx][ny].push_back(horse);
    					int nidx = Chess[nx][ny].size() - 1;
    					Horse[horse] = { nidx, nx , ny, Horse[horse].dir };
    					moved++;
    				}
    				for (int i = 0; i < moved; i++) {
    					Chess[x][y].pop_back();
    				}
    				set = true;
    				if (Chess[nx][ny].size() >= 4) return true;
    			}
    
    			// 빨간색
    			else if (board[nx][ny] == 1) {	
    				for (int i = size - 1; i >= idx; i--) {
    					int horse = Chess[x][y][Chess[x][y].size() - 1];
    					Chess[nx][ny].push_back(horse);
    					int nidx = Chess[nx][ny].size() - 1;
    					Horse[horse] = { nidx, nx , ny, Horse[horse].dir };
    					Chess[x][y].pop_back();
    				}
    				set = true;
    				if (Chess[nx][ny].size() >= 4) return true;
    			}
    
    			// 파란색 혹은 외부영역
    			else if (board[nx][ny] == 2) {	
    				if (blue == false) {
    					int ndir = dir_op[dir];
    					Horse[h] = { idx , x , y, ndir };
    					blue = true;
    				}
    				else {
    					Horse[h] = { idx , x , y, dir };
    					break;
    				}
    			}
    		}
    	}
    	return false;
    }
    
    
    
    
    int simulation()
    {
    	for (int turn = 1; turn <= 1000; turn++) {
    		//debug_h();
    		if (play_game()) return turn;
    	}
    	return -1;
    }
    
    
    
    
    int main()
    {
    	input();
    	make_bound();
    	int ans = simulation();
    	printf("%d\n", ans);
    	return 0;
    }

    1. 외부 영역을 파란색 칸으로 만들어서 흰색 / 빨간색 / 파란색 칸을 만났을 때 세 가지 케이스만 판단하도록 구현했다. 

    2. 파란색 칸을 만나면 다시 탐색을 진행해야 하는데, 이 부분을 재귀로 구현해도 되지만 나는 그냥 쉽게 for 루프 두 번 돌렸다. 

     

    728x90

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

    [백준 20057] 마법사 상어와 토네이도  (0) 2022.10.10
    [백준 20056] 마법사 상어와 파이어볼  (0) 2022.10.10
    [백준 19237] 어른 상어  (0) 2022.10.10
    [백준 1726] 로봇  (0) 2022.10.10
    [백준 17143] 낚시왕  (0) 2022.10.06

    댓글

Designed by Tistory.