사다리 조작
본문 바로가기
알고리즘 모음집/New 알고리즘

사다리 조작

by KyeongMin 2020. 10. 11.
728x90
반응형

www.acmicpc.net/problem/15684

 

15684번: 사다리 조작

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

www.acmicpc.net

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
#define NS 11//세로선의 최대 개수
#define HS 31//가로선의 최대 개수
int N, M, H;//세로선의 수, 그어져있는 가로선, 놓을수 잇는 가로선의 수
int ret;//결과값 입력
int ladder[HS][NS];//사다리 배열
void init_input() {//초기화 및 초기 입력
	//초기화 
	N = M = H = 0; ret = 0x7fffffff;
	memset(ladder, 0, sizeof(ladder));
	//초기 입력
	scanf("%d %d %d", &N, &M, &H);//초기 입력
	for (int m = 0; m < M; m++) {//가로선 그어 놓기
		int y, x;
		scanf("%d %d", &y, &x);
		ladder[y][x] = 1;// 가로서 긋기
	}
}
bool chkLadder() {//사다리 조작 맞는지 확인
	for (int x = 1; x <= N; x++) {
		int cx = x;
		for (int y = 1; y <= H; y++) {
			if (ladder[y][cx] == 1) {
				cx++;
			}
			else if (ladder[y][cx - 1] == 1) {
				cx--;
			}
		}
		if (x != cx)return false;//조건에 맞지 않는 경우
	}
	return true;//조건에 부합하는 경우 
}
void dfs(int y, int x, int cnt) {
	if (ret < cnt)return;
	else if(0<=cnt&&cnt<=3){//0인 시점부터 확인하기 
		if (chkLadder()) {
			ret = min(ret, cnt);
		}
		if (cnt == 3)return;
	}
	for (int i = y; i <= H; i++) {
		for (int j = x; j <= N; j++) {
			if (ladder[i][j] == 0 && ladder[i][j - 1] == 0 && ladder[i][j + 1] == 0) {
				//현재 위치가 그어져 있지 않고 양쪽도 선이 없는 경우
				ladder[i][j] = 1;//선 긋기
				dfs(i, j + 1, cnt + 1);
				ladder[i][j] = 0;//다시 돌아와 제거하기
			}
		}
		x = 1;
	}
}
int main(void) {
	int T = 1;//테스트 케이스 개수
	//scanf("%d", &T);
	for (int tc = 1; tc <= T; tc++) {
		init_input();//초기화 및 초기 입력
		dfs(1, 1, 0);
		//출력
		if (0x7fffffff == ret)ret = -1;
		printf("%d\n", ret);
		//printf("#%d %d\n", tc, ret);
	}
	return 0;
}

 

dfs에 인덱스 넘길때 실수 해서 시간초과가 처음에 났었는데 그런것 빼고는 설계오류는 적었습니다. 이런 실수 하지 마시고 이런거는 가로 세로가 헷갈릴수 있으니 그런거 항상 잘기억하셔야합니다.

728x90
반응형

'알고리즘 모음집 > New 알고리즘' 카테고리의 다른 글

연구소 2  (0) 2020.10.12
원판 돌리기  (0) 2020.10.12
낚시왕  (0) 2020.10.11
캐슬 디펜스  (0) 2020.10.11
감시  (0) 2020.10.11

댓글