Problem Solving/SWEA
SWEA 2105번: [모의 SW 역량테스트] 디저트 카페
이진2
2020. 5. 22. 15:35
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5VwAr6APYDFAWu
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
그림같은 맵이 있을 때, 같은 번호를 가진 node는 거치지 않고 마름모 모양으로 맵을 순회할 수 있는지 구하는 문제
순회 루트를 찾으면 되는데, BFS로 해줄 필요는 없이
그냥 이동 방향을 처음부터 내 맘대로(↖↗↘↙) 정한 뒤 최대 크기의 경로를 구해줬다
이동하면서 숫자 배열의 "현재 방문한 번호 인덱스"를 방문처리 해주면서 진행하면 된당
#include <cstdio>
#include <cstring>
int tc, n, map[21][21], ans, dx[] = { -1,1,1,-1 }, dy[] = { -1,-1,1,1 };
bool num[101];
typedef struct {
int x, y;
}point;
point s;
bool safe(point p) { return p.x >= 0 && p.x < n && p.y >= 0 && p.y < n; }
void func(point cur,int dep, int sum) {
if (dep > 3)return;
point p = cur;
p.x += dx[dep], p.y += dy[dep];
while (safe(p) && !num[map[p.y][p.x]]) {
if (dep == 3 && cur.x == s.x && cur.y == s.y) {
if (sum > ans)ans = sum; break;
}
sum++;
num[map[p.y][p.x]] = 1;
func(p, dep + 1, sum);
p.x += dx[dep], p.y += dy[dep];
}
if (p.x == s.x && p.y == s.y)
if (sum > ans)ans = sum;
cur.x += dx[dep], cur.y += dy[dep];
while (!(cur.x == p.x && cur.y == p.y)) {
num[map[cur.y][cur.x]] = 0;
cur.x += dx[dep], cur.y += dy[dep];
}
}
int main() {
scanf("%d", &tc);
for (int T = 1; T <= tc; T++) {
ans = -1;
scanf("%d", &n);
for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)
scanf("%d", &map[i][j]);
for(int i=2;i<n;i++)
for (int j = 1; j < n; j++) {
memset(num, 0, sizeof(num));
num[map[i][j]] = 1;
s = { j,i };
func({ j,i }, 0, 1);
}
printf("#%d %d\n", T, ans);
}
return 0;
}
+ 요즘드는 생각: 진작에 A+ 딸걸 ^^ 그랬다면 지금 면접준비만 하면 될텐데 😂