페이지

2234번: 성곽

https://www.acmicpc.net/problem/2234


#include<stdio.h>
int fx[4] = { 0,1,0,-1 }, fy[4] = { 1,0,-1,0 }, n, m, map[51][51], check[51][51], cnt, data[2501], max, max2;
void dfs(int i, int j, int k)
{
    check[i][j] = cnt;
    data[cnt]++;
    if (k<8 && check[i + 1][j] == 0)
    {
        dfs(i + 1, j, map[i + 1][j]);
    }
    else if (k >= 8)
    {
        k -= 8;
    }
    if (k<4 && check[i][j + 1] == 0)
    {
        dfs(i, j + 1, map[i][j + 1]);
    }
    else if (k >= 4)
    {
        k -= 4;
    }
    if (k<2 && check[i - 1][j] == 0)
    {
        dfs(i - 1, j, map[i - 1][j]);
    }
    else if (k >= 2)
    {
        k -= 2;
    }
    if (k == 0 && check[i][j - 1] == 0)
    {
        dfs(i, j - 1, map[i][j - 1]);
    }
}
int main()
{
    int i, j, k;
    scanf("%d%d", &m, &n);
    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= m; j++)
        {
            scanf("%d", &map[i][j]);
        }
    }
    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= m; j++)
        {
            if (check[i][j] == 0)
            {
                ++cnt;
                dfs(i, j, map[i][j]);
                if (data[cnt]>max2)
                {
                    max2 = data[cnt];
                }
            }
        }
    }
    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= m; j++)
        {
            for (k = 0; k<4; k++)
            {
                if (check[i][j] != check[i + fx[k]][j + fy[k]] && max<data[check[i][j]] + data[check[i + fx[k]][j + fy[k]]])
                {
                    max = data[check[i][j]] + data[check[i + fx[k]][j + fy[k]]];
                }
            }
        }
    }
    printf("%d\n%d\n%d", cnt, max2, max);
    return 0;
}

댓글 없음 :

댓글 쓰기