ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준 14500] 테트로미노
    C 프로그래밍/BOJ 2022. 11. 28. 14:23
    728x90

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

     

    14500번: 테트로미노

    폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변

    www.acmicpc.net

    #include <cstdio>
    #include <cstring>
    int N, M;
    int A[500 + 2][500 + 2];
    int ans;
    
    int tetro_lookup[19][4][2] = {
    	// |
    	{{0, 0}, {0, 1}, {0, 2}, {0, 3}},
    	// ㅡ
    	{{0, 0}, {1, 0}, {2, 0}, {3, 0}},
    	// cube
    	{{0, 0}, {0, 1}, {1, 0}, {1, 1}},
    	// |_
    	{{0, 0}, {1, 0}, {2, 0}, {2, 1}},
    	// _|
    	{{0, 0}, {1, 0}, {2, 0}, {2, -1}},
    	// -|
    	{{0, 0}, {0, 1}, {1, 1}, {2, 1}},
    	// |-
    	{{0, 0}, {0, -1}, {1, -1}, {2, -1}},
    	//'ㅡ
    	{{0, 0}, {1, 0}, {1, 1}, {1, 2}},
    	// ㅡ'
    	{{0, 0}, {1, 0}, {1, -1}, {1, -2}},
    	// ,ㅡ
    	{{0, 0}, {-1, 0}, {-1, 1}, {-1, 2}},
    	// ㅡ,
    	{{0, 0}, {-1, 0}, {-1, -1}, {-1, -2}},
    	// '-,
    	{{0, 0}, {1, 0}, {1, 1}, {2, 1}}, 
    	// ,-'
    	{{0, 0}, {1, -1}, {1, 0}, {2, -1}},
    	// _-
    	{{0, 0}, {0, 1}, {-1, 1}, {-1, 2}},
    	// -_
    	{{0, 0}, {0, 1}, {1, 1}, {1, 2}},
    	//-,-
    	{{0, 0}, {0, 1}, {0, 2}, {1, 1}},
    	// _'_
    	{{0, 0}, {0, 1}, {-1, 1}, {0, 2}}, 
    	// |-
    	{{0, 0}, {1, 0}, {1, 1}, {2, 0}},
    	// -|
    	{{0, 0}, {1, 0}, {2, 0}, {1, -1}}
    };
    
    
    void input()
    {
    	scanf("%d %d", &N, &M);
    	for (int i = 0; i < N; i++) {
    		for (int j = 0; j < M; j++) {
    			scanf("%d", &A[i][j]);
    		}
    	}
    }
    
    
    int get_sum(int x, int y)
    {
    	int res = 0;
    	for (int k = 0; k < 19; k++) {
    		int each_sum = 0;
    		bool done = true;
    		for (int p = 0; p < 4; p++) {
    			int nx = x + tetro_lookup[k][p][0];
    			int ny = y + tetro_lookup[k][p][1];
    			if (nx < 0 || nx > N - 1 || ny < 0 || ny > M - 1) {
    				done = false;
    				break;
    			}
    			each_sum += A[nx][ny];
    		}
    		if (done == true && each_sum > res) res = each_sum;
    	}
    	return res;
    }
    
    
    void find_max_value()
    {
    	for (int i = 0; i < N; i++) {
    		for (int j = 0; j < M; j++) {
    			int res = get_sum(i, j);
    			if (res > ans) ans = res;
    		}
    	}
    }
    
    
    
    int main()
    {
    	input();
    	find_max_value();
    	printf("%d\n", ans);
    	return 0;
    }

    숙원사업들 하나씩 뿌셔가는 중.. ㅋㅋ

    19개 도형에 대한 룩업테이블 잘 만들어주고, 입력받은 board 안 모든 좌표에 대하여 각 좌표를 기준으로 19가지 도형을 놓아보면서 가장 큰 수 가 만들어지는 경우 ans에 저장한다. 

    이때 도형의 일부가 영역 밖으로 나가면 그것은 도형이 놓아졌다고 볼 수 없으므로, done이라는 플래그를 두어 해당 플래그가 true일 때만 최댓값을 갱신하도록 구현했다. 

    728x90

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

    [백준 3055] 탈출  (0) 2022.11.30
    [백준 15683] 감시  (0) 2022.11.29
    [백준 13460] 구슬탈출 2  (0) 2022.11.27
    [백준 20926] 얼음미로  (0) 2022.11.27
    [백준 4577] 소코반  (0) 2022.11.27

    댓글

Designed by Tistory.