์ฝ”๋”ฉํ…Œ์ŠคํŠธ/์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต

[C++] ์‚ผ์„ฑ 2105. [๋ชจ์˜ SW ์—ญ๋Ÿ‰ํ…Œ์ŠคํŠธ] ๋””์ €ํŠธ ์นดํŽ˜

Bradbury 2020. 10. 27. 18:02
728x90
#include <iostream>
#include <vector>
 
using namespace std;
 
int N;
int input_array[20][20];
int dessert[101] = { 0, };
int dArr[][2] = { { -1,1 },{ 1,1 },{ 1,-1 },{ -1,-1 } };
int first_x, first_y;
int max_count = -1;
 
void recursive(int a, int b, int n, int direction) {
    int x = a + dArr[direction][0];
    int y = b + dArr[direction][1];
    
    if (x >= N || y >= N || x < 0 || y < 0 || direction > 3) // ๋ฐฐ์—ด ๋ฒ”์œ„๋ฅผ ๋„˜๊ฑฐ๋‚˜ 4๋ฐฉํ–ฅ ํšŒ์ „์„ ๋„˜์—ˆ์„ ๊ฒฝ์šฐ
        return;
 
    if (dessert[input_array[x][y]] == 1) // ๊ฐ™์€ ์ข…๋ฅ˜์˜ ๋””์ €ํŠธ๋ฅผ ํŒ”๊ณ  ์žˆ์„ ๊ฒฝ์šฐ
        return;
 
    if (direction == 3 && first_x == x && first_y == y){ // 4๋ฐฉํ–ฅ ํšŒ์ „์„ ํ•˜๊ณ  ์›์ ์œผ๋กœ ๋Œ์•„์˜จ ๊ฒฝ์šฐ
        if (n > max_count)
            max_count = n;
    }
 
    dessert[input_array[x][y]] = 1;
 
    recursive(x, y, n + 1, direction); // ๊ธฐ์กด ๋ฐฉํ–ฅ์œผ๋กœ
    recursive(x, y, n + 1, direction+1); // ๋‹ค์Œ ๋ฐฉํ–ฅ์œผ๋กœ
 
    dessert[input_array[x][y]] = 0;
 
    return;
}
 
int main(int argc, char** argv)
{
    int test_case;
    int T;
 
    cin >> T;
 
    for (test_case = 1; test_case <= T; ++test_case)
    {
        cin >> N;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                cin >> input_array[i][j];
            }
        }
 
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                first_x = i;
                first_y = j;
                recursive(i, j, 1, 0);
            }
        }
        cout << "#" << test_case << " " << max_count << endl;
        max_count = -1;
    }
    return 0;
}
728x90