아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

분자, 분자

시간 제한1초메모리 제한128 MB

요약
격자 이웃 원자 사이에 결합을 배치해 탄소 4개 질소 3개 산소 2개 수소 1개를 모두 만족할 수 있는지 판정합니다.
난이도

보통10점 중 7점

유형
그래프
정답자
아직 제출이 없습니다

문제

유기 분자는 놀랄 만큼 복잡해질 수 있어서, 특히 3차원 구조까지 자세히 그리려면 다양한 모양과 표기법이 필요하다. 하지만 원자 사이가 모두 단일 결합인 비교적 간단한 화합물로 범위를 좁히면, 결합이 모두 가로나 세로를 향하는 직사각형 격자 위에 분자를 그릴 수 있다. 이런 분자에서 탄소는 이웃한 원자 4개, 질소는 3개, 산소는 2개, 수소는 1개와 결합한다.

결합은 가로나 세로로 맞닿은 두 칸의 원자 사이에만 생기고, 같은 두 원자는 많아야 한 번 결합한다. 맞닿았다고 해서 반드시 결합하지는 않는다. 따라서 격자가 올바른 분자를 나타낸다는 말은, 모든 원자가 자기 결합 수를 정확히 채우도록 결합을 고를 수 있다는 뜻이다.

모든 격자가 올바른 분자가 되지는 않는다. 주어진 격자가 올바른 분자를 나타내는지 판정하는 프로그램을 작성하시오.

입력

입력은 격자로 그린 분자 후보 여러 개로 이루어진다. 각 후보의 첫 줄에는 뒤따르는 직사각형의 행 수와 열 수를 나타내는 두 정수 r와 c가 주어진다 (1≤r,c≤51 \le r, c \le 5). 다음 r개 줄에는 각각 c개의 문자가 주어지고, 각 문자는 .(빈칸), H(수소), O(산소), N(질소), C(탄소) 중 하나다. 입력은 0이 두 개 있는 줄로 끝난다.

올바르다고 판정한 분자가 실제로 존재할 수 있는 물질은 아닐 수 있고, 한 격자 안에 분자가 둘 이상 들어 있을 수도 있다.

출력

분자 후보마다 다음 두 줄 중 하나를 출력한다.

Molecule <num> is valid.
Molecule <num> is invalid.

여기서 <num>은 1부터 시작하는 일련번호다.

예제1

  1. 예제 1

    입력
    3 4
    HOH.
    NCOH
    OO..
    3 4
    HOH.
    NCOH
    OONH
    2 3
    HOH
    HOH
    0 0
    
    예상 출력
    Molecule 1 is valid.
    Molecule 2 is invalid.
    Molecule 3 is valid.