ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준 1175] 배달
    C 프로그래밍/BOJ 2022. 10. 25. 01:40
    728x90

    일트 성공 ㅋ 기부니가 좋다고요~

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

     

    1175번: 배달

    어제 선물을 모두 포장한 민식이는 이제 선물을 배달하려고 한다. 민식이가 선물을 배달할 곳은 이 문제를 읽는 사람들이 앉아 있는 교실이다. 교실은 직사각형모양이고, 모두 같은 크기의 정사

    www.acmicpc.net

    #include <cstdio>
    #include <queue>
    int N, M;
    char board[50 + 2][50 + 2];
    int visited[50 + 2][50 + 2][4 + 2][3 + 2];	// (좌표) (방향) (어디어디 방문했는지)
    int arrv_bit[2] = { 1, 2 };
    
    struct _qt
    {
    	int x, y;
    	int dir;
    	int cnt;
    	int arrv;
    	bool chk[2] = {false, };
    };
    
    std::queue<_qt> Q;
    
    struct _st
    {
    	int x, y;
    };
    
    _st C[2];
    
    void input()
    {
    	scanf("%d %d", &N, &M);
    	int num = 0;
    	for (int i = 0; i < N; i++) {
    		scanf("%s", &board[i]);
    		for (int j = 0; j < M; j++) {
    			if (board[i][j] == 'S') {
    				Q.push({ i, j, -1, 0 , 0, {false, false} });
    				board[i][j] = '.';
    			}
    			if (board[i][j] == 'C') {
    				C[num].x = i;
    				C[num].y = j;
    				num++;
    			}
    		}
    	}
    }
    
    int BFS()
    {
    	static int dir_x[4] = { 0, 0 ,1, -1 };
    	static int dir_y[4] = { 1, -1, 0, 0 };
    	
    
    	while (!Q.empty()) {
    		_qt data = Q.front();
    		//printf("(%d %d) [%d] %d %d %d\n", data.x, data.y, data.dir, data.cnt, data.chk[0], data.chk[1]);
    		Q.pop();
    
    		if (data.chk[0] == true && data.chk[1] == true) return data.cnt;
    
    
    		for (int p = 0; p < 4; p++) {
    			if (p == data.dir) continue;	// 같은 방향으로 두 번 연속 이동할 수 없다.
    			_qt next = data;
    			next.x = data.x + dir_x[p];
    			next.y = data.y + dir_y[p];
    			next.dir = p;
    			next.cnt = data.cnt + 1;
    
    			if (next.x < 0 || next.x > N - 1 || next.y < 0 || next.y > M - 1) continue;
    			if (visited[next.x][next.y][next.dir][next.arrv]) continue;
    			if (board[next.x][next.y] == '#') continue;
    			if (board[next.x][next.y] == 'C') {
    				int type = -1;
    				if (next.x == C[0].x && next.y == C[0].y) type = 0;
    				else type = 1;
    			
    				if (next.chk[type] == true) continue;
    				next.chk[type] = true;
    				next.arrv += arrv_bit[type];
    			}
    			visited[next.x][next.y][next.dir][next.arrv] = 1;
    			Q.push(next);
    		}
    	}
    	return -1;
    }
    
    
    
    
    int main()
    {
    	input();
    	int ans = BFS();
    	printf("%d\n", ans);
    	return 0;
    }

    방향만 따져주어서는 안되는 문제이다.

    해당 좌표에 도착했을 때, 몇 군데의 C를 방문했는지 까지 고려해주어야 한다.

    따라서 상태 발전을 위한 정보에 (현재좌표(x, y), 현재방향, 이동거리, 몇 군데 방문했는지, 어디 방문했는지) 를 넣어주었다. 

    728x90

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

    [자료구조] Greedy  (0) 2022.10.26
    [백준 1162] 도로포장  (0) 2022.10.26
    [백준 1039] 교환  (0) 2022.10.24
    [백준 19236] 청소년 상어  (0) 2022.10.24
    [백준 10217] KCM Travel  (0) 2022.10.24

    댓글

Designed by Tistory.