[Unrated] [모의 SW 역량테스트] 디저트 카페 - 2105
[Unrated] [모의 SW 역량테스트] 디저트 카페 - 2105
문제 링크
성능 요약
메모리: 13,544 KB, 시간: 174 ms
코드길이: 1,768 Bytes
출처: SW Expert Academy, https://swexpertacademy.com/main/code/problem/problemList.do
코드
#include<iostream>
#include<cstring>
#include <algorithm>
#include<vector>
using namespace std;
int arr[21][21];
int N;
int res;
int st_x, st_y;
bool visited[101];
int dx[4] = { 1 , -1, -1, 1 };
int dy[4] = { 1, 1, -1, -1 };
void dfs(int y, int x, int dir) {
if (dir == 4) {
//도착 확인
if (st_x == x && st_y == y) {
int sum = 0;
for (int i = 0; i < 101; i++)
{
if (visited[i]) {
sum++;
}
}
res = max(sum, res);
}
return;
}
for (int i = 1; i < N; i++)
{
int nx = dx[dir]*i + x;
int ny = dy[dir]*i + y;
if (nx < 0 || ny < 0 || nx >= N || ny >= N) return;
// 사이 경로 방문 처리
for (int j = 1; j <= i; j++)
{
int nx2 = dx[dir] * j + x;
int ny2 = dy[dir] * j + y;
// 경로 사이에 중복되는 디저트 종류 존재할 경우
if (visited[arr[ny2][nx2]]) {
for (int k = 0; k < j; k++)
{
int nx3 = dx[dir] * k + x;
int ny3 = dy[dir] * k + y;
visited[arr[ny3][nx3]] = false;
}
return;
}
visited[arr[ny2][nx2]] = true;
}
dfs(ny, nx, dir + 1);
for (int j = 1; j <= i; j++)
{
int nx2 = dx[dir] * j + x;
int ny2 = dy[dir] * j + y;
visited[arr[ny2][nx2]] = false;
}
}
}
int main(int argc, char** argv)
{
int test_case;
int T;
cin >> T;
for (test_case = 1; test_case <= T; ++test_case)
{
res = -1;
memset(arr, 0, sizeof(arr));
cin >> N;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> arr[i][j];
}
}
// 우하 -> 좌하 -> 좌상 -> 우상
for (int i = 0; i < N-2; i++)
{
for (int j = 1; j < N-1; j++)
{
memset(visited, 0, sizeof(visited));
st_y = i; st_x = j;
dfs(st_y, st_x, 0);
}
}
cout << "#" << test_case << " "<< res << "\n";
}
return 0;//정상종료시 반드시 0을 리턴해야합니다.
}
This post is licensed under CC BY 4.0 by the author.