-
[SWEA]2105 디저트 까페문제 풀이 2020. 5. 1. 21:42
2105 디저트 까페
풀이)
dfs를 이용해서 푼 문제이다.
최대한 중복되는 사각형 모양을 거르기 위해 두가지 방법을 사용했다.
1. 맨왼쪽, 맨오른쪽, 맨아래쪽에서 시작하는 경우는 사각형을 이루지 못하므로 계산에서 제외한다.
2. 사각형으로 움직일때, 무조건 오른쪽 아래부터 시작한다.
주의할 점
출발점으로 돌아왔을때, 디저트의 수는 무조건 4개 이상이며 방향으로 제일 마지막 방향 상태여야한다.
코드)
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364#include <stdio.h>#include <algorithm>using namespace std;int n;int map[21][21];int starty, startx; //시작점//방향 0 1 2 3//오른쪽아래, 왼쪽아래, 왼쪽위, 오른쪽위int dy[4] = { 1,1,-1,-1 };int dx[4] = { 1,-1,-1,1 };int result = -1;bool check[101];//현재 좌표, 가는 방향, 지금까지 디저트 개수void dfs(int y,int x, int dir,int val) {if (dir > 3)return;int ny = y + dy[dir];int nx = x + dx[dir];if (ny == starty && nx == startx && val >= 4 && dir==3) { //출발점으로 돌아왔을 경우result = max(result, val);return;}if (ny >= 0 && ny < n && nx >= 0 && nx < n) {if (!check[map[ny][nx]]) {check[map[ny][nx]] = true;dfs(ny, nx, dir, val + 1);// 가던 방향 계속dfs(ny, nx, dir + 1, val + 1); //방향 바꿈check[map[ny][nx]] = false;}}}int main() {//freopen("sample_input.txt", "r", stdin);int T = 0;scanf("%d", &T);for (int test_case = 1; test_case <= T; test_case++) {scanf("%d", &n);for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {scanf("%d", &map[i][j]);}}//n은 4<=n<=20for (int i = 0; i < n-1; i++) {for (int j = 1; j < n-1; j++) {check[map[i][j]] = true;starty = i;startx = j;dfs(i, j, 0, 1);check[map[i][j]] = false;}}printf("#%d %d\n", test_case, result);result = -1;}return 0;}cs '문제 풀이' 카테고리의 다른 글
[SWEA] 2477 차량 정비소 (0) 2020.05.06 [SWEA] 2112. 보호필름 (0) 2020.05.04 [SWEA] 1949 등산로 조성 (0) 2020.04.29 [SWEA] 2817 부분수열의 합 (0) 2020.04.28 [SWEA] 1928 Base Decoder (0) 2020.04.27