본문 바로가기

코딩테스트/SWEA

[SWEA] 디저트 카페

SWEA 디저트 카페 C++ 풀이

 

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5VwAr6APYDFAWu

 

 

// 브루트 포스 재귀 문제이다.
// 일단 마름모 꼴로 시계 방향으로 움직이는 dx, dy 선언하고
// 각 점마다 solve 함수를 실행을 하는데 시작하는 점을 따로 기억을 해줘야함
// 그래야 solve 함수 내에서 종료조건에서 비교할 수있음
// solve 함수에서 원래 방향을 진행하는 경우와 1씩 증가시키는 경우로 재귀함수 진행해 주자 여기가 포인트임

#include <iostream>
#include <algorithm>

using namespace std;

int map[21][21] = { 0, };
bool check[101] = { 0, };

int dx[] = { 1,1,-1,-1 };
int dy[] = { 1,-1,-1,1 };

int N, sx, sy, ans;

void solve(int x, int y, int cnt, int dir) {


	if (dir == 3) {
		if (x == sx + 1 && y == sy - 1) {
			ans = max(ans, cnt);
			return;
		}
	}

	int nx = x + dx[dir];
	int ny = y + dy[dir];

	if (nx >= 0 && nx < N && ny >= 0 && ny < N) {
		if (!check[map[nx][ny]]) {
			check[map[nx][ny]] = true;
			solve(nx, ny, cnt + 1, dir);
			solve(nx, ny, cnt + 1, dir + 1);
			check[map[nx][ny]] = false;
		}
	}
}

int main() {

	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	int T;

	cin >> T;

	for (int tc = 1; tc <= T; tc++) {

		ans = -1;

		cin >> N;

		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				cin >> map[i][j];
			}
		}

		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				sx = i, sy = j;
				check[map[i][j]] = true;
				solve(i, j, 1, 0);
				check[map[i][j]] = false;
			}
		}

		cout << "#" << tc << " " << ans << "\n";

	}

}

'코딩테스트 > SWEA' 카테고리의 다른 글

[SWEA] 점심 시간  (0) 2023.07.11
[SWEA] 등산로 조성문제  (0) 2023.07.11
[SWEA] 벌꿀 채취  (0) 2023.07.11
[SWEA] 수영장  (0) 2023.07.11
[SWEA] 보호필름  (0) 2023.07.07