Ancient Hieroglyphs

Time limit1sMemory limit192 MB

Summary
Decode a hex bitmap, count enclosed white regions (holes) inside each connected black shape, and map each shape's hole count to a hieroglyph code.
Level

Medium5 of 10

Topics
Graph, DFS, BFS, Implementation
Solved
No attempts yet

Problem

Archaeologists study writing in ancient languages to understand early civilizations. About 30003000 years ago, the Egyptians used an ancient script called hieroglyphs, whose characters were modeled on animals, objects, and parts of the body.

In this problem you write a program that recognizes the following six hieroglyphs. Each hieroglyph is a single shape made of connected black pixels, and the six are distinguished by having different numbers of holes (white regions completely enclosed by the shape). In other words, the number of holes alone determines which hieroglyph it is.

HieroglyphCodeHoles
AnkhA1
WedjatJ3
DjedD5
ScarabS4
WasW2
AkhetK0

Determine every hieroglyph that appears in the given image.

Input

The input consists of several test cases. Each test case is a single image containing one or more hieroglyphs. The image is made of 00s and 11s, where 11 is a black pixel and 00 is a white pixel.

Each line of the image is encoded in hexadecimal. For example, the eight pixels 1001110010011100 are encoded as 9c. The hexadecimal encoding uses the characters 0–9 and a–f.

The first line of each test case contains two integers HH and WW. HH (0<H≤2000 < H \le 200) is the number of image lines and WW (0<W≤500 < W \le 50) is the number of hexadecimal characters on each line, so the image is 4W4W pixels wide. The next HH lines give the image.

Each input image satisfies the following rules.

  1. The image contains only the six hieroglyphs described above.
  2. Every image contains at least one valid hieroglyph.
  3. Every black pixel is part of some valid hieroglyph.
  4. A hieroglyph is a connected set of black pixels: every black pixel is adjacent (up, down, left, or right) to at least one other black pixel.
  5. Distinct hieroglyphs do not touch one another, and no hieroglyph is contained inside another.
  6. Whenever two black pixels touch diagonally, there is a black pixel that is orthogonally adjacent to both of them.
  7. A hieroglyph may be somewhat distorted, but its number of holes is always as given in the table above.

The line after the last test case contains two 00s.

Output

For each test case, print one line in the form Case x: codes, where xx is the test case number starting from 11 and codes is the string of hieroglyph codes appearing in the image, sorted in alphabetical order.

Examples2

  1. Example 1

    Input
    100 25
    0000000000000000000000000
    0000000000000000000000000
    0000000000000000000000000
    0000000000000000000000000
    0000000000000000000000000
    0000000000000000000000000
    0000000000000000000000000
    0000000000000000000000000
    0000000000000000000000000
    00000f8000000000000000000
    00001fe000000000000000000
    00007ff000000000000000000
    00007ff800000000000000000
    0000f8f800000000000000000
    0001f07c00000000000000000
    0001e03c00000000001800000
    0001e01c00000000003c00000
    0001c01c00000000007c00000
    0003c01e0000000000f800000
    0003c01e0000000001f000000
    0001c01c0000000003f000000
    0001c01c0000000007e000000
    0001e01c000000000fc000000
    0001e03c000000001fc000000
    0000e03c000000001fc000000
    0000f038000000003ff000000
    0000f078000000003ff800000
    00007870000000007ff800000
    000038f0000000007cfc00000
    00003ce0000000007c7c00000
    00781fc0f0000000f87c00000
    007ffffff0000000f07c00000
    007ffffff0000000f07c00000
    007ffffff0000001f07c00000
    007ffffff0000000e03e00000
    007fcf81f0000000603e00000
    00000f8000000000003e00000
    00000f8000000000003e00000
    00000f8000000000003e00000
    00000f8000000000001e00000
    00000f8000000000001f00000
    00000fc000000000001f00000
    00000fc000000000001f00000
    00000fc000000000001f00000
    00000fc000000000000f00000
    00001fc000000000000f80000
    00001fc000000000000f80000
    00001fc000000000000f80000
    00001fc000000000000f80000
    00001fe000000000000f80000
    00001fe000000000000780000
    00001fe0000000000007c0000
    00001fe0000000000007c0000
    00003fe0000000000007c0000
    00003fe0000000000007c0000
    00003fe0000000000007c0000
    00003fe0000c00000003c0000
    00000000003ff0000003c0000
    00000000007ff8000003e0000
    0000000001fffc000003e0000
    0000000003e03f000003e0000
    0000000007c00f000003e0000
    000000000f0003800003f0000
    000000000e0001c00003fc000
    000000001c0001e00007fe000
    000000003c0000e0000fff000
    000000073c000070000fdf000
    0000001ff8000070001f0f800
    0000001ff8000070001e07800
    0000003cf0000078001e03800
    0000003870000033001e03800
    000000307800003fc01e03800
    000000703800007fe00e03800
    000000703800007ce00e03800
    000000703c000078700703800
    000000701e0000f0700701000
    000000701e0000e0700300000
    000000700f0001c0700000000
    0000006007800380600000000
    000000e003e00700600000000
    000000e001fe7e00600000000
    000000e000fffc00e00000000
    000000e0000ff000e00000000
    000000f800038000e00000000
    000000fff0000000e00000000
    000000fffff00000e00000000
    00000003ffffe000c00000000
    0000000007ffffc0c00000000
    000000000007ffffc00000000
    0000000000000fffc00000000
    000000000000001fc00000000
    0000000000000000000000000
    0000000000000000000000000
    0000000000000000000000000
    0000000000000000000000000
    0000000000000000000000000
    0000000000000000000000000
    0000000000000000000000000
    0000000000000000000000000
    0000000000000000000000000
    150 38
    00000000000000000000000000000000000000
    00000000000000000000000000000000000000
    00000000000000000000000000000000000000
    00000000000000000000000000000000000000
    00000000000000000000000000000000000000
    00000000000000000000000000000000000000
    00000000000000000000000000000000000000
    00000000000000000000000000000000000000
    00000000000000000000000000000000000000
    00000f80000000001fff000000000000000000
    00001fe0000000007fff800000000000000000
    00007ff000000000ffffe00000000000000000
    00007ff800000003fffff0000000007c000000
    0000f8f800000007fffffc00000000fe000000
    0001f07c0000000ffffffe00000001ff000000
    0001e03c0000001fffffff00000003ff800000
    0001e01c0000003fffffff00000003ffc00000
    0001c01c0000003fffffff80000007efc00000
    0003c01e0000007fffffffc000000783c00000
    0003c01e000000ffffffffc000000f81e00000
    0001c01c000000fffc0fffe000000f01e00000
    0001c01c000001fff003ffe000000f01e00000
    0001e01c000001ffe001fff000000f00e00000
    0001e03c000003ffc0007ff000001e00f00000
    0000e03c000003ff80007ff800001e00f00000
    0000f038000007ff80003ff800001e00f00000
    0000f078000007ff00003ff800001e00f00000
    00007870000007ff00001ffc00000e00e00000
    000038f000000fff00001ffc00000e00e00000
    00003ce000000ffe00000ffc00000e00e00000
    00781fc0f0000ffe00000ffc00000f00e00000
    007ffffff0000ffc00000ffc00000f01e00000
    007ffffff0000ffc00000ffc00000f01e00000
    007ffffff0000ffc00000ffc00000701c00000
    007ffffff0000ffc00000ffc00000781c00000
    007fcf81f0000ffc000007fc00000783c00000
    00000f8000000ffc000007fc00000383800000
    00000f8000000ffc000007fc000003c7800000
    00000f8000000ffc000007fc000001c7800000
    00000f8000000ffc000007fc000001e7000000
    00000f8000000ffc000007fc000200ef008000
    00000fc000000ffc00000ffc0003f8fe3f8000
    00000fc000000ffc00000ffc0003ffffff8000
    00000fc000000ffc00000ffc0003ffffff8000
    00000fc000000ffc00000ffc0003ffffff8000
    00001fc000000ffc00000ffc0003ffffff8000
    00001fc0000007fe00000ff80003ffffff8000
    00001fc0000007fe00000ff80003fffdff8000
    00001fc0000007fe00000ff80003c03c000000
    00001fe0000007ff00001ff80000007c000000
    00001fe0000003ff00001ff00000007c000000
    00001fe0000003ff00001ff00000007c000000
    00001fe0000001ff80003ff00000007c000000
    00003fe0000001ff80003fe00000007c000000
    00003fe0000001ff80003fe00000007c000000
    00003fe0000000ffc0007fe00000007c000000
    00003fe0000000ffc0007fc00000007e000000
    000000000000007fe0007fc00000007e000000
    000000000000007fe000ff800000007e000000
    000000000000007ff001ff800000007e000000
    000000000000003ff001ff80000000fe000000
    000000000000001ff803ff00000000fe000000
    000000000000001ff803ff00000000fe000000
    000000000000000ffc07fe00000000fe000000
    000000000000000ffc0ffc00000000fe000000
    000000000000000ffe0ffc00000000fe000000
    0000000000000007ff0ff800000000fe000000
    0000000000000003ff1ff000000000ff000000
    0000000003c00001ffbff00000f000ff000000
    0000000003ffc001ffffe0007ff000ff000000
    0000000003fffff1ffffe3fffff000ff000000
    0000000003fffffffffffffffff001ff000000
    0000000003fffffffffffffffff001ff000000
    0000000003fffffffffffffffff001ff000000
    0000000003fffffffffffffffff001ff000000
    0000000003fffffffffffffffff001ff000000
    0000000003fffffffffffffffff001ff000000
    0000000003fffffffffffffffff00000000000
    0000000003fffffffffffffffff00000000000
    0000000003fffffffffffffffff00000000000
    0000000003fffffffffffffffff00000000000
    0000000003fffffffffffffffff00000000000
    0000000003fffffffffffffffff00000000000
    0000000003fffffc1ffe0007fff00000000000
    0000000003ff80000ffe000000f00000000000
    00000000038000000ffe000000000000000000
    00000000000000001fff000000000000000000
    00000000000000001fff000000000000000000
    00000000000000001fff000000000000000000
    00000000000000001fff000000000000000000
    00000000000000001fff000000000000000000
    00000000000000001fff000000000000000000
    00000000000000003fff000000000000000000
    00000000000000003fff000000000000000000
    00000000000000003fff0000000fc000000000
    000000000fe000003fff8000003ff000000000
    000000003ffc00003fff8000007ffc00000000
    00000000fffe00003fff800000fcfc00000000
    00000001f01f00003fff800001f03e00000000
    00000003e00f80003fff800003e01f00000000
    00000003e00780003fff800003e00f00000000
    00000003e00780003fff800003c00f00000000
    00000003e00f80003fff800003c00f00000000
    00000001f00f00007fff800003c00f00000000
    00000000f81e00007fffc00003e00f00000000
    000000007c3c00007fffc00001e01e00000000
    000000003e7800007fffc00000f01e00000000
    000000fffffffe007fffc00000f03c00000000
    000000fffffffe007fffc00000787800000000
    000000fffffffe007fffc000003cf000000000
    0000000007c000007fffe000f81fe07c000000
    0000000007e000007fffe000fffffffc000000
    0000000007e000007fffe000fffffffc000000
    000000000fe000007fffe000fffffffc000000
    000000000ff00000ffffe000ffc7c0fc000000
    000000000ff00000ffffe0000007c000000000
    000000001ff00000ffffe000000fc000000000
    000000001ff00000ffffe000000fc000000000
    000000001ff80000ffffe000000fc000000000
    000000001ff80000ffffe000000fc000000000
    000000003ff80001ffffe000000fe000000000
    000000003ff80001ffffe000000fe000000000
    0000000000000001fffff000001fe000000000
    0000000000000001fffff000001fe000000000
    0000000000000001fffff000001fe000000000
    0000000000000001fffff000001ff000000000
    0000000000000001fffff000001ff000000000
    0000000000000001fffff000001ff000000000
    0000000000000001fffff000003ff000000000
    0000000000000001fffff000003ff000000000
    0000000000000001fffff000003ff000000000
    0000000000000001fffff80000000000000000
    0000000000000003fffff80000000000000000
    0000000000000003fffff80000000000000000
    0000000000000003fffff80000000000000000
    0000000000000003fffff80000000000000000
    0000000000000003fffff80000000000000000
    0000000000000003fffff80000000000000000
    0000000000000003fffff80000000000000000
    0000000000000003fffffc0000000000000000
    0000000000000003fffffc0000000000000000
    0000000000000007fffffc0000000000000000
    0000000000000007fffffc0000000000000000
    0000000000000007fffffc0000000000000000
    00000000000000000000000000000000000000
    00000000000000000000000000000000000000
    00000000000000000000000000000000000000
    00000000000000000000000000000000000000
    00000000000000000000000000000000000000
    00000000000000000000000000000000000000
    0 0
    
    Expected output
    Case 1: AKW
    Case 2: AAAAA
    
  2. Example 2

    Input
    15 5
    00000
    00000
    00000
    1ff00
    1ff00
    1ff00
    1cf00
    1cf00
    1ff00
    1ff00
    1ff00
    1ff00
    00000
    00000
    00000
    0 0
    
    Expected output
    Case 1: A