테트로미노
본문 바로가기
알고리즘 모음집/New 알고리즘

테트로미노

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

www.acmicpc.net/problem/14500

 

14500번: 테트로미노

폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변�

www.acmicpc.net

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
#define NMS 500//N과M의 최대 크기
int N, M;//가로크기 , 세로 크기
int ret;//최종 최대값
int B[NMS][NMS];//보드판 초기입력
int cB[NMS][NMS];//테트로미노 생성할 배열
int dy[] = {0,1,0,-1};
int dx[] = {1,0,-1,0};
void printArr(int A[NMS][NMS]) {
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			printf("%d", A[i][j]);
		}
		printf("\n");
	}
}
void init_input() {//초기화 및 초기 입력
	//초기화
	N = M = 0;
	ret = 0x80000000;
	memset(B, 0, sizeof(B));
	memset(cB, 0, sizeof(cB));
	//초기 입력
	scanf("%d %d", &N, &M);//가로 세로 크기 입력
	for (int i = 0; i < N; i++) {//초기 배열값 입력
		for (int j = 0; j < M; j++) {
			scanf("%d", &B[i][j]);
		}
	}
}
bool safe(int y, int x) {
	return 0 <= y && y < N && 0 <= x && x < M;
}
void dfs(int y, int x, int cnt,int sum) {
	if (cnt == 3) {
		/*printArr(cB);
		cout << endl;*/
		ret = max(ret, sum);
		return;
	}

	for (int dir = 0; dir < 4; dir++) {
		int ny = y + dy[dir]; int nx = x + dx[dir];
		if (safe(ny, nx) && cB[ny][nx] == 0) {
			cB[ny][nx] = 1;
			sum += B[ny][nx];
			dfs(ny, nx, cnt + 1,sum);
			sum -= B[ny][nx];
			cB[ny][nx] = 0;
		}
	}
}
void dfs1(int y, int x, int cnt,int dir, int sum) {//가운데 ->인경우
	if (cnt == 2) {
		/*printArr(cB);
		cout << endl;*/
		ret = max(ret, sum);
		return;
	}
		int ny = y + dy[dir]; int nx = x + dx[dir];
		if (safe(ny, nx) && cB[ny][nx] == 0) {
			if (cnt == 1) {
				int cdir = dir;
				cdir=(++cdir)%4;
				int cny = y + dy[cdir]; int cnx = x + dx[cdir];
				if (safe(cny, cnx)) {
					sum += B[ny][nx];
					sum += B[cny][cnx];
					cB[ny][nx] = 1;
					cB[cny][cnx] = 1;
					dfs1(ny, nx, cnt + 1, dir, sum);
					cB[cny][cnx] = 0;
					sum -= B[ny][nx];
					sum -= B[cny][cnx];
					cB[ny][nx] = 0;
				}
				else return;

			}
			else {
				cB[ny][nx] = 1;
				sum += B[ny][nx];
				dfs1(ny, nx, cnt + 1,dir, sum);
				sum -= B[ny][nx];
				cB[ny][nx] = 0;
			}
		}
}
void dfs2(int y, int x, int cnt, int sum) {//가운데 <-인경우

}
void gameStart() {//게임 시작
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			cB[i][j] = 1;
			dfs(i, j, 0,B[i][j]);//배열의 시작y,x,cnt;
			for (int dir = 0; dir < 4; dir++) {
				dfs1(i, j, 0, dir, B[i][j]);
			}
			cB[i][j] = 0;
		}
	}
}
int main(void) {
	int T = 1;//테스트 개스
	//scanf("%d", &T);
	for (int tc = 1; tc <= T; tc++) {
		//초기화 및 초기 입력
		init_input();
		gameStart();//게임 시작
		//출력값
		printf("%d\n", ret);
		//printf("#%d %d\n", tc, ret);
	}
	return 0;
}

dfs의 특성을 이용해서 구현하였습니다. 하지만 ㅗ ㅓ ㅜ ㅏ 인경우 dfs로 구현할 수 없기때문에 

ㅣ ㅡ 에 가운데에 위아래 넣어서 계산하여 문제를 풀이 하였습니다. 참고 해주세요

728x90
반응형

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

캐슬 디펜스  (0) 2020.10.11
감시  (0) 2020.10.11
로봇 청소기  (0) 2020.10.11
2048 (Easy)  (0) 2020.10.10
나무 재테크  (0) 2020.10.10

댓글