본문 바로가기
알고리즘 문제풀이/백준

[백준 15684] 사다리 조작

by m2162003 2020. 12. 17.

www.acmicpc.net/problem/15684

 

15684번: 사다리 조작

사다리 게임은 N개의 세로선과 M개의 가로선으로 이루어져 있다. 인접한 세로선 사이에는 가로선을 놓을 수 있는데, 각각의 세로선마다 가로선을 놓을 수 있는 위치의 개수는 H이고, 모든 세로선

www.acmicpc.net

계속 시간초과와 원인모를 틀렸습니다를 받은 문제..

dfs를 사용해서 구현하는 문제이다. 

 

전체 배열에서 a번째 줄 b와 b+1 사다리가 연결되어 있다면 arr[a][b] =true로 표시한다.

이렇게 표시한 사다리는 i번째 사다리가 i번째에 도달하는지 확인할 때 왼쪽 오른쪽 모두 확인해서 현재 위치를 col +-1해줘야 한다.

 

추가된 사다리가 4이상이면 -1을 출력하라고 했으므로 cnt>3이면 return;하여 함수를 종료시킨다.

result값이 정해지면 (하나라도 사다리 값이 나오면) 그 이상 함수를 진행하지 않기 위해 if(result != 4) return; 조건을 추가해야 한다. 아니면 TLE가 발생함 ㅠ

result는 최솟값을 리턴해야 하므로 매번 비교해줘야 한다. 아니면 틀린다!!

 

#include <stdio.h>

using namespace std;
int n, m, h, ladders;
bool arr[31][11];
int result = 4;

bool isValid()
{
  for (int i = 1; i <= n; i++)
  {
    int curC = i;
    for (int j = 1; j <= h; j++)
    {
      if (arr[j][curC])
      {
        curC++;
      }
      else if (arr[j][curC - 1])
      {
        curC--;
      }
    }

    if (curC != i)
    {
      return false;
    }
  }
  return true;
}

void BackTracking(int row, int cnt)
{
  if (result != 4)
  {
    return;
  }

  if (cnt > 3)
  {
    return;
  }

  if (cnt == ladders)
  {
    if (isValid())
    {
      result = result > cnt ? cnt : result;
    }
    return;
  }

  for (int i = row; i <= h; i++)
  {
    for (int j = 1; j < n; j++)
    {
      if (arr[i][j] || arr[i][j - 1] || arr[i][j + 1])
        continue;

      arr[i][j] = true;
      BackTracking(i, cnt + 1);
      arr[i][j] = false;
    }
  }
}

int main(void)
{
  scanf("%d%d%d", &n, &m, &h);

  for (int i = 0; i < m; i++)
  {
    int a, b;
    scanf("%d%d", &a, &b);
    arr[a][b] = true;
  }

  for (int i = 0; i <= 3; i++)
  {
    ladders = i;
    BackTracking(1, 0);
    if (result != 4)
    {
      printf("%d\n", result);
      return 0;
    }
  }
  printf("-1\n");

  return 0;
}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 1978] 소수 찾기  (0) 2020.12.18
[백준 6064] 카잉 달력  (0) 2020.12.18
[백준 14503] 로봇 청소기  (0) 2020.12.17
[백준 14499] 주사위 굴리기  (0) 2020.12.17
[백준 15686] 치킨 배달  (0) 2020.12.16

댓글