ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 - 색종이 붙이기 [17136]
    공부/baekjoon 문제 2019. 6. 19. 14:48

    * 해당 코드의 결과는 "틀렸습니다" 입니다. 아직 해결하지 못한코드이니 참고만 해주시길 바랍니다.

    #include <iostream>
    #include <algorithm>
    #include <vector>
    
    
    using namespace std;
    int map[10][10];
    int v[10][10];
    int result = 0;
    
    int mat[6] = { 5,5,5,5,5,5 };
    vector<int> t;
    
    void checking(int x, int y, int size) {
    	int i = x;
    	int j = y;
    	bool check = false;
    
    	if (x + size - 1 > 9) return;
    	if (y + size - 1 > 9) return;
    
    	for (int k = 0; k < size; k++) {
    		for (int l = 0; l < size; l++) {
    			if (map[i + k][j + l] == 0 || v[i + k][j + l]) {
    				check = true;
    			}
    		}
    	}
    
    	if (!check && mat[size] > 0) {
    		for (int k = 0; k < size; k++) {
    			for (int l = 0; l < size; l++) {
    				v[i + k][j + l] = true;
    			}
    		}
    		mat[size]--;
    		result++;
    	}
    }
    
    void ff(vector<int> real, int n) {
    
    	for (int size = 0; size < n; size++)
    	{
    		for (int i = 0; i < 10; i++) {
    			for (int j = 0; j < 10; j++) {
    				if (map[i][j] == 1 && !v[i][j]) {
    					checking(i, j, real[size]);
    				}
    			}
    		}
    	}
    }
    
    int main() {
    	bool check = false;
    	vector<int> r;
    	int size = 5;
    	t.push_back(5);
    	t.push_back(4);
    	t.push_back(3);
    	t.push_back(2);
    	t.push_back(1);
    	for (int i = 0; i < 10; i++) {
    		for (int j = 0; j < 10; j++)
    			cin >> map[i][j];
    	}
    
    	for (int i = 0; i < 10; i++) {
    		for (int j = 0; j < 10; j++) {
    			v[i][j] = false;
    		}
    	}
    
    	while (size > 1) {
    		vector<int> ind;
    
    		for (int i = 0; i < 5 - size; i++)
    			ind.push_back(0);
    		for (int i = 0; i < size; i++)
    			ind.push_back(1);
    
    		do {
    			vector<int> real;
    
    			for (int i = 0; i < 5; i++)
    				if (ind[i] == 1)
    					real.push_back(t[i]);
    
    			ff(real, size);
    
    			for (int i = 0; i < 10; i++) {
    				for (int j = 0; j < 10; j++) {
    					if (!v[i][j] && map[i][j] == 1)
    						check = true;
    				}
    			}
    
    			if (check)
    				r.push_back(100);
    			else
    				r.push_back(result);
    
    			check = false;
    			for (int i = 0; i < 10; i++) {
    				for (int j = 0; j < 10; j++) {
    					v[i][j] = false;
    				}
    			}
    			result = 0;
    			for (int i = 1; i < 6; i++)
    				mat[i] = 5;
    
    		} while (next_permutation(ind.begin(), ind.end()));
    		size--;
    	}
    
    
    	sort(r.begin(), r.end());
    
    	if (r.front() == 100)
    		cout << -1;
    	else
    		cout << r.front();
    	return 0;
    }

    '공부 > baekjoon 문제' 카테고리의 다른 글

    백준 문제 풀다보면 느끼는거  (0) 2019.06.23
    백준 - 빗물 [14719]  (0) 2019.06.21
    백준 - 전광판의 숫자 [16159]  (0) 2019.06.19
    백준 - 연구소 3 [17142]  (0) 2019.06.13
    백준 - 캐슬 디펜스 [17135]  (0) 2019.06.13

    댓글

Designed by Tistory.