본문 바로가기
CS/알고리즘

백준 14500 테트로미노

by zieunee 2020. 1. 24.
반응형

https://www.acmicpc.net/problem/14500

 

14500번: 테트로미노

폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변끼리 연결되어 있어야 한다. 즉, 꼭짓점과 꼭짓점만 맞닿아 있으면 안 된다. 정사각형 4개를 이어 붙인 폴리오미노는 테트로미노라고 하며, 다음과 같은 5가지가 있다. 아름이는 크기가 N×M인 종이 위에 테트로미노 하나를 놓으려고 한다. 종이는 1×1 크기의 칸으로 나누

www.acmicpc.net

테트로미노 다시 풀어보기 

 

TIP!! >> 계속 시간 초과가 났음 >>

memset을 시켜주어서 났던 문제이다. 

 

전에 푼것도 똑같은 상황에 있었는데 

진짜 필요한거 아니면 memset은 자제하자

//14500 테트로미노
#define _CRT_SECURE_NO_WARNINGS

#include<iostream>
#include<string.h>
#include<algorithm>	

using namespace std;

int N, M;
int map[501][501];
int visited[501][501];
int res;
int dy[4] = { 1, 0, -1, 0 };
int dx[4] = { 0, 1, 0, -1 };
int ans;
int solveRes;
void dfs(int x, int y, int cnt, int val) {
	if (cnt == 4) {
		res = max(res, val);
		return;
	}

	for (int i = 0; i < 4; i++) {
		int nx = x + dx[i];
		int ny = y + dy[i];

		if (visited[nx][ny] == 0 && nx >= 0 && ny >= 0 && nx < N && ny < M) {
			visited[nx][ny] = 1;
			dfs(nx, ny, cnt + 1, val + map[nx][ny]);
			visited[nx][ny] = 0;
		}
	}

}

int solve(int x, int y) { // ㅗ 모양 
	//4가지 
	int res;
	if (x + 1 < N && y + 1 < M && y - 1 >= 0) {//ㅗ
		res = map[x][y] + map[x + 1][y] + map[x + 1][y - 1] + map[x + 1][y + 1];
		solveRes = max(res, solveRes);
	}
	if (x + 2 < N && y + 1 < M) {//ㅏ
		res = map[x][y] + map[x + 1][y] + map[x + 2][y] + map[x + 1][y + 1];
		solveRes = max(res, solveRes);
	}
	if (x + 2 < N && y - 1 >= 0) {//ㅓ
		res = map[x][y] + map[x + 1][y] + map[x + 2][y] + map[x + 1][y - 1];
		solveRes = max(res, solveRes);
	}
	if (x - 1 >= 0 && y + 1 < M && y - 1 >= 0) {//ㅜ
		res = map[x][y] + map[x - 1][y] + map[x - 1][y - 1] + map[x - 1][y + 1];
		solveRes = max(res, solveRes);
	}

	return solveRes;

}
int main() {

	scanf("%d%d", &N, &M);
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			scanf("%d", &map[i][j]);
		}
	}

	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			visited[i][j] = 1;
			dfs(i, j, 1, map[i][j]);
			ans = max(ans, res);
			ans = max(ans, solve(i, j));
			//memset(visited, 0, sizeof(visited));
			visited[i][j] =0;
		}
	}

	printf("%d", ans);
	return 0;
}

반응형

'CS > 알고리즘' 카테고리의 다른 글

백준 5397 키로거  (0) 2020.02.10
백준 3098 소셜네트워크  (0) 2020.02.10
백준 17142 연구소3(bfs dfs)  (0) 2019.10.27
백준 16234 인구이동(bfs)  (0) 2019.10.27
백준 9019 DSLR(bfs)  (0) 2019.10.27