www.codeup.kr/problem.php?id=4033
네모네모 로직
[문제3] 네모네모 로직 (20점, 제한시간 1초) 네모네모 로직은 숫자를 이용하여 그림을 만드는 퍼즐로서 picross로 불리기도 한다. 아래의 그림에서 왼쪽이 15x15 크기의 퍼즐의 문제이다. 여기에 적
www.codeup.kr
문제 분류 : 보기
문제 설명 내 문제집에 추가 풀이1(C/C++) 내소스1
[문제3] 네모네모 로직 (20점, 제한시간 1초)
네모네모 로직은 숫자를 이용하여 그림을 만드는 퍼즐로서 picross로 불리기도 한다. 아래의 그림에서 왼쪽이 15x15 크기의 퍼즐의 문제이다. 여기에 적혀진 숫자는 연속해서 칠해야 하는 칸의 수를 나타낸다. 예를 들어, “4 3”은 4칸 연속해서 칠한 다음에 3칸을 연속해서 칠한다는 의미이다. 그러나 칠해진 4칸과 칠해진 3칸 사이에는 최소한 1개 이상의 칠해지지 않은 칸이 있어야 한다. 아래 그림의 왼쪽 문제에 대한 답은 오른쪽의 그림이다.
네모네모 로직에 흥미를 느낀 길동은 이 퍼즐을 컴퓨터 프로그램으로 풀어보기로 하고, 우선 하나의 줄에 대해서 몇 가지 경우가 있는지를 헤아려 보기로 하였다.
한 줄에 있는 칸의 수와 칠해야 되는 연속칸을 나타내는 수들이 입력되었을 때, 몇 가지의 경우가 가능한지를 구하는 프로그램을 작성하시오.
입력
1. 첫째 줄에는 전체 칸의 수 n이 입력된다. (1≤n≤20)
2. 두 번째 줄에는 연속칸의 개수 k가 입력된다. (1≤k)
3. 세 번째 줄에는 k개의 자연수가 공백으로 분리되어 입력된다. 이 숫자들은 각각의 연속칸의 크기를 나타낸다.
4. 입력은 최소한 1개 이상의 경우를 만들 수 있는 수들이 입력된다. 즉, n이 15일 때 “10 2 2”와 같이 색 칠하기가 불가능한 수는 입력되지 않는다.
출력
1. 주어진 입력에 대하여 몇 가지의 칠하기가 가능한지를 하나의 정수로서 출력한다.
입력 예시 예시 복사
15 3 5 4 3
출력 예시
4
#include <iostream>
using namespace std;
int arr[20];
int cnt;
void bck(int sum, int idx, int prev, int n, int k)
{
//cout << sum << " " << idx << " ";
if (sum > n || idx > k)
return ;
else if (sum == n && idx < k )
return ;
if (sum == n && idx == k )
{
cnt++;
//cout << "a ";
return ;
}
if (prev == 0)
bck(sum + arr[idx], idx + 1, 1, n, k);
bck(sum + 1, idx, 0, n, k);
}
int main(void)
{
int n, k;
cin >> n >> k;
for (int i = 0; i < k; i++)
cin >> arr[i];
cnt = 0;
bck(0, 0, 0, n, k);
cout << cnt;
}
➜ Backtracking git:(master) ✗ g++ 4033nemologic.cpp;./a.out
8 2 3 4
0 3 4 8 5 9 6 10 7 11 8 1 4 5 9 6 10 7 11 8 2 5 6 10 7 11 8 3 6 7 11 8 4 7 8 5 8 6 9 7 10 8 6%
➜ Backtracking git:(master) ✗ g++ 4033nemologic.cpp;./a.out
8 2 3 4
0 3 4 8 5 9 6 10 7 11 8 a 1 4 5 9 6 10 7 11 8 a 2 5 6 10 7 11 8 a 3 6 7 11 8 a 4 7 8 a 5 8 a 6 9 7 10 8 6%
➜ Backtracking git:(master) ✗ g++ 4033nemologic.cpp;./a.out
8 2 3 4
0 0 3 1 4 1 8 2 5 1 9 2 6 1 10 2 7 1 11 2 8 1 a 1 0 4 1 5 1 9 2 6 1 10 2 7 1 11 2 8 1 a 2 0 5 1 6 1 10 2 7 1 11 2 8 1 a 3 0 6 1 7 1 11 2 8 1 a 4 0 7 1 8 1 a 5 0 8 1 a 6 0 9 1 7 0 10 1 8 0 6%
➜ Backtracking git:(master) ✗ g++ 4033nemologic.cpp;./a.out
8 2 3 4
0 0 3 1 4 1 8 2 a 5 1 9 2 6 1 10 2 7 1 11 2 8 1 1 0 4 1 5 1 9 2 6 1 10 2 7 1 11 2 8 1 2 0 5 1 6 1 10 2 7 1 11 2 8 1 3 0 6 1 7 1 11 2 8 1 4 0 7 1 8 1 5 0 8 1 6 0 9 1 7 0 10 1 8 0 1%
➜ Backtracking git:(master) ✗ g++ 4033nemologic.cpp;./a.out
15 3 5 4 3
0 0 5 1 6 1 10 2 11 2 14 3 15 3 a 12 2 15 3 a 13 2 16 3 14 2 17 3 15 2 7 1 11 2 12 2 15 3 a 13 2 16 3 14 2 17 3 15 2 8 1 12 2 13 2 16 3 14 2 17 3 15 2 9 1 13 2 14 2 17 3 15 2 10 1 14 2 15 2 11 1 15 2 12 1 16 2 13 1 17 2 14 1 18 2 15 1 1 0 6 1 7 1 11 2 12 2 15 3 a 13 2 16 3 14 2 17 3 15 2 8 1 12 2 13 2 16 3 14 2 17 3 15 2 9 1 13 2 14 2 17 3 15 2 10 1 14 2 15 2 11 1 15 2 12 1 16 2 13 1 17 2 14 1 18 2 15 1 2 0 7 1 8 1 12 2 13 2 16 3 14 2 17 3 15 2 9 1 13 2 14 2 17 3 15 2 10 1 14 2 15 2 11 1 15 2 12 1 16 2 13 1 17 2 14 1 18 2 15 1 3 0 8 1 9 1 13 2 14 2 17 3 15 2 10 1 14 2 15 2 11 1 15 2 12 1 16 2 13 1 17 2 14 1 18 2 15 1 4 0 9 1 10 1 14 2 15 2 11 1 15 2 12 1 16 2 13 1 17 2 14 1 18 2 15 1 5 0 10 1 11 1 15 2 12 1 16 2 13 1 17 2 14 1 18 2 15 1 6 0 11 1 12 1 16 2 13 1 17 2 14 1 18 2 15 1 7 0 12 1 13 1 17 2 14 1 18 2 15 1 8 0 13 1 14 1 18 2 15 1 9 0 14 1 15 1 10 0 15 1 11 0 16 1 12 0 17 1 13 0 18 1 14 0 19 1 15 0 4%
디버깅 현장..
idx == k 가 아닌 idx == k - 1 했어서 오류가 났었다.
해결 완료!
'C언어' 카테고리의 다른 글
백준 1912 연속합 문제 *max_element(d + 1, d + n + 1); 사용 (0) | 2021.01.23 |
---|---|
백준 11726 2*n 타일링 ( 시간 지나고 또 품) (0) | 2021.01.23 |
백준 1149 rgb 거리 (0) | 2021.01.22 |
codeup코드업 2608 동아리 회장 선거 (0) | 2021.01.20 |
Codeup 코드업 3120 리모콘 온도 (0) | 2021.01.19 |
codeup 2652 영화관 문제 2 (0) | 2021.01.18 |
Codeup 코드업 2651: 극장좌석배치1 (0) | 2021.01.18 |
2605 codeup문제 캔디팡 floodfill문제 (0) | 2021.01.10 |