코드
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <cmath>
#include <queue>
#include <deque>
#include <stack>
using namespace std;
int Answer = 999999;
int map[10][10];
int paper[5] = { 5,5,5,5,5 };
void init() {
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
cin >> map[i][j];
}
}
}
bool one_left() {
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if (map[i][j]==1)return false;
}
}
return true;
}
//만약 5,5주어지고 5장짜리면, 5 6 7 8 9 임 -> 10을 넘김녀 안됌, y도 마찬가지
bool check_size(int x, int y , int k) {
if ((x + k >= 10) || (y + k >= 10)) return false;
return true;
}
//k숫자만큼 1이 있는지 확인
bool check_paper(int x, int y, int k) {
//3,3위치에서 k가 4이면 5장이라는거임 5장이면 3,4,5,6,7임 그러면 i는 3이고 i< 3+4+1인 8이어야함
for (int i = x; i < x + k+1; i++) {
for (int j = y; j < y + k+1; j++) {
if (!map[i][j]) return false;
}
}
return true;
}
void fill_paper(int x, int y, int k) {
//k가 4이면 5장을 채워야한다는거임 x 가 3이면 3,4,5,6,7 이고 x+k가 3+4니까 7이다. 고로 8이 와야하므로
for (int i = x; i < x + k+1; i++) {
for (int j = y; j < y + k+1; j++) {
map[i][j] = 0;
}
}
}
void unfill_paper(int x, int y, int k) {
//k가 4이면 5장을 채워야한다는거임 x 가 3이면 3,4,5,6,7 이고 x+k가 3+4니까 7이다. 고로 8이 와야하므로
for (int i = x; i < x + k + 1; i++) {
for (int j = y; j < y + k + 1; j++) {
map[i][j] = 1;
}
}
}
void solve(int cnt) {
if (cnt > Answer) return;
//색종이를 다 채운경우
if (one_left()) {
if (cnt < Answer) {
Answer = cnt;
return;
}
}
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if (map[i][j]==1) {
for (int k = 4; k >= 0; k--) {
if (paper[k] > 0 && check_size(i,j,k) && check_paper(i,j,k)) {
paper[k]--;
fill_paper(i, j, k);
solve(cnt + 1);
unfill_paper(i, j, k);
paper[k]++;
}
}
return;
}
}
}
}
int main() {
init();
solve(0);
if (Answer == 999999) { cout << "-1"; }
else {
cout << Answer;
}
}