성보 문제

4258 단어
성보 문제
문제 설명
오른쪽 그림은 성곽의 지형도이다.성곽이 모두 몇 개의 방, 가장 큰 방이 얼마나 큰지 계산하는 프로그램을 만들어 보세요.성곽이 m로 분할되다×n(m≤50, n≤50)개의 네모난 블록은 각 네모난 블록마다 0~4면의 벽이 있을 수 있다.
입출력
입력
 프로그램은 표준 입력 장치에서 데이터를 읽습니다. 첫 줄은 두 개의 정수로 각각 남북방향, 동서방향의 네모난 수이다. 다음 입력 줄에서 각 블록은 하나의 숫자(0≤p≤50)로 설명한다.네모난 블록 주위의 벽을 한 숫자로 표시하고, 1은 서쪽 벽, 2는 북쪽 벽, 4는 동쪽 벽, 8은 남쪽 벽을 나타낸다.각 블록은 주변 벽을 나타내는 숫자의 합으로 표시됩니다.성곽의 내벽은 두 번 계산되고 네모난 벽(1,1)의 남쪽 벽은 네모난 벽(2,1)의 북쪽 벽이기도 하다. 입력한 데이터는 성에 적어도 두 개의 방이 있다는 것을 보증한다.城의 방수, 성곽의 최대 방에 포함된 네모난 수를 출력합니다. 결과는 표준 출력 장치에 표시됩니다.
예제
샘플 입력
4
7
11 6 11 6 3 10 6
7 9 6 13 5 15 5
1 10 12 7 13 7 5
13 11 10 8 10 12 13
샘플 출력
5
9
#include 
#include 
#include 
using namespace std;

int rooms[60][60], colors[60][60];
int maxRoomArea=0;//        
int roomArea;//        
int roomNum = 0;//    ,      

void dfs(int i, int j)
{
    if( colors[i][j])
        return ;
    roomArea++;
    colors[i][j] = roomNum;
    if( (rooms[i][j] & 1) == 0) dfs(i, j-1);//        
    if( (rooms[i][j] & 2) == 0) dfs(i-1, j);//        
    if( (rooms[i][j] & 4) == 0) dfs(i, j+1);//        
    if( (rooms[i][j] & 8) == 0) dfs(i+1, j);//        

}

int main()
{
    int C, L;
    cin >> C >> L;
    for(int i=1; i<=C; i++)
    {
        for(int j=1; j<=L; j++)
        {
            cin >> rooms[i][j];
        }
    }

    memset(colors, 0, sizeof(colors));
    for(int i=1; i<=C; i++)
    {
        for(int j=1; j<=L; j++)
        {
            if( !colors[i][j])
            {
                roomArea = 0;
                roomNum++;
                dfs(i,j);
                maxRoomArea = max(roomArea, maxRoomArea);
            }
        }
    }

    cout << roomNum << endl;
    cout << maxRoomArea << endl;
    return 0;
}

좋은 웹페이지 즐겨찾기