728x90
반응형
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#define NS 21
int N;
int input[NS][NS];
int cnt;
int ret = 0x80000000;
int dy[] = { -1,1,1,-1};
int dx[] = { -1,-1,1,1};
bool safe(int y, int x) {
if (0 <= y && y < N && 0 <= x && x < N) return true;
else return false;
}
bool chk(int rotY,int rotX,int sy,int sx) {
int numFood[101] = { 0, };// 음식 중복체크
cnt = 0;//먹은 디저트수
int y = sy; int x = sx;
for (int dir = 0; dir < 4; dir++) {
if (dir == 0 || dir == 2) {
for (int i = 0; i < rotY; i++) {
y += dy[dir]; x += dx[dir];
if(safe(y,x)&&numFood[input[y][x]]==0){
numFood[input[y][x]] = 1;
cnt++;
}
else return false;
}
}
else {
for (int i = 0; i < rotX; i++) {
y += dy[dir]; x += dx[dir];
if (safe(y, x) && numFood[input[y][x]] == 0) {
numFood[input[y][x]] = 1;
cnt++;
}
else return false;
}
}
}
return true;
}
void eatFood() {
for (int rotY = 1; rotY <= N - 1; rotY++) {
for (int rotX = 1; rotX <= N - 1; rotX++) {
for (int y = 0; y < N; y++) {
for (int x = 0; x < N; x++) {
if (chk(rotY,rotX,y,x)) {
ret = ret < cnt ? cnt : ret;
}
}
}
}
}
}
void init() {
ret = 0x80000000;
memset(input, 0, sizeof(input));
cin >> N;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> input[i][j];
}
}
eatFood();
}
int main(void) {
int T;
cin >> T;
for (int tc = 1; tc <= T; tc++) {
init();
if (ret == 0x80000000)ret = -1;
cout << '#' << tc << " " << ret << endl;
}
return 0;
}
대략적으로 간단하게 설계를 하고 함수를 나눠서 문제풀이를 진행했습니다. 이문제는 대각선으로 이동시키는 것을 완전탐색으로 했는데 최적인 방법이 아닐 수 있지만 이렇게도 풀리는것을 보인 문제입니다. 참고해주시고
질문하실것 있으시면 질문해주세요
728x90
반응형
'알고리즘 모음집 > 알고리즘 (Algorithm)' 카테고리의 다른 글
[모의 SW 역량테스트] 홈 방범 서비스 (0) | 2019.12.01 |
---|---|
[모의 SW 역량테스트] 벽돌 깨기 (0) | 2019.11.28 |
프로그래머스 - 2020 KAKAO BLIND RECRUITMENT 블록 이동하기 (0) | 2019.11.14 |
백준 17780 새로운 게임 (0) | 2019.11.14 |
SW Expert Academy - [모의 SW 역량테스트] 보호 필름 (0) | 2019.11.14 |
댓글