Problem Statement
Christmas is hard when you have twins. You have to buy all presents twice, and divide everything evenly. Problems arise when your cooking skills aren't up to par and one of your cakes ends up having a weird shape. How shall you divide it?
The cake is a rectangular bitmap: the cells marked '#' form the cake, all other cells are marked '.' and represent empty space.
The cake must be divided into two geometrically equivalent parts. (I.e., you must be able to transform one part into the other by applying translations, rotations and mirror images.) Each cell must completely belong into one of the two parts. Each part must hold together.
Count the number of ways in which this can be done. (Two ways of cutting are different if the unordered pairs of sets of cells differ.)
Definition
- Class:
- ChristmasTwins
- Method:
- countCuts
- Parameters:
- String[]
- Returns:
- long
- Method signature:
- long countCuts(String[] bitmap)
- (be sure your method is public)
Constraints
- bitmap will be a rectangle.
- bitmap will contain at most 50 characters.
- Each character in bitmap will be '#' or '.'.
- bitmap will contain between 1 and 42 '#' characters.
Examples
{".####", "#####", "###.."}
Returns: 1
The only valid way to cut this cake: .1122 11222 112..
{"###", "###"}
Returns: 3
Solutions: 111 222 112 122 122 112
{"#####", "#.#..", ".....", "..#.#", "#####"}
Returns: 1
{"#####", "#.#..", ".....", "..###", "#####"}
Returns: 0
{"###", ".#.", ".#.", ".#."}
Returns: 1
{"####", "####", "####", "####"}
Returns: 22
Some of the solutions: 1111 1111 2222 2222 1111 1121 2122 2222 1111 1222 1112 2222 1112 1112 1222 1222 1122 1122 1122 1122
{"#.#.#.#"}
Returns: 0
{"########", "########", "########", "########", "########"}
Returns: 1675
{"#######", "#######", "#######", "#######", "#######", "#######"}
Returns: 2947
{"##########", "##########", "##########", "##########"}
Returns: 1228
{"##############", "##############", "##############"}
Returns: 495
{"#####################", "#####################"}
Returns: 21
{"##########################################"}
Returns: 1
{".#####", "######", "######", "####.."}
Returns: 0
{"#"}
Returns: 0
{"##"}
Returns: 1
{"#","#"}
Returns: 1
{"#####","#####","#####","#####","####."}
Returns: 0
{".####.", "######", "######", "######", "######", ".####."}
Returns: 318
{".##....", ".#####.", ".######", ".######", "..###.."}
Returns: 1
{".######", "#######", "#######", "#######", "#####.."}
Returns: 1
.112222 1122222 1121122 1111222 11112..
{".#####.", "#######", "#######", "##...##", "#######", "#######", ".#####." }
Returns: 688
{"##.##########.##", "#####.####.#####", "##.##########.##"}
Returns: 55
{"###########.####", ".##.####.#..####", "################"}
Returns: 0
{"####..#############..####", "#######.###.#.###.#######"}
Returns: 0
{"########.#.###.###.############.###.###.#.########"}
Returns: 0
{"##.##", "#####", "##.##", "#####", "#####", ".#.#.", "##.##", "#####", "#.#.#", "#####"}
Returns: 0
{"######.##.######", "#####.####.#####", "######.##.######"}
Returns: 0
{"#######", "##.#.##", "#######", "#######", "#######", "##.#.##", "##...##"}
Returns: 0
{"############", ".##########.", "#.##.##.##.#", "############"}
Returns: 1
{"###", ".##", ".##", "###", "##.", "##.", "###", "###", "###", "###", "#.#", ".##", "###", "###", "###", "###"}
Returns: 0
{"##########", "##.####.##", "#..####..#", "####..####", "##########"}
Returns: 1
{"###.", "####", "####", "####", "####", "###.", "##..", "####", "###.", "###.", "####", "####"}
Returns: 0
{".####.", "######", "######", "#.##.#", "######", "######", "######", "##..##"}
Returns: 1
{"#", "#", ".", "#", "#", "#", "#", "#", "#", "#", ".", ".", "#", "#", ".", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", ".", "#", "#", "#", "#", "#", "#", ".", "#", "#", "#", ".", "#", ".", "#"}
Returns: 0
{"##.#.", "#####", "#####", ".####", "##.##", "##.##", ".####", "#####", "#####", "##.#."}
Returns: 1
{"###########.", "##.#####.###", "##.#####.###", "###########."}
Returns: 1
{"###.##.#####", "#########.##", "##.######.##", "#.##########"}
Returns: 0
{"########", "##.##.##", "###..###", "###..###", "##.##.##", "########"}
Returns: 56
{"#########.###.#####.#.######.#.#####.###.#########"}
Returns: 0
{"######.##.######", "#.############.#", "######.##.######"}
Returns: 3
{"#.##########.##.", "##.####.########", "#########.######"}
Returns: 0
{"#.#", "#.#", "###", "###", "###", "#.#", "###", "#.#", "###", "###", "#.#", "###", "###", "#.#", "###", "###"}
Returns: 0
{"#######.#########.###.####.#..#########..#########"}
Returns: 0
{"#.####", ".#####", "######", "#.####", "#.####", "######", ".#####", "#.####"}
Returns: 0
{"##", "##", "..", "##", "##", "##", "##", "##", "..", "##", "##", "##", "##", "##", "##", "##", "..", "##", "##", "##", "##", "##", "..", "##", "##"}
Returns: 0
{"#######", "###.###", "#.###.#", "#######", "###.###", "#######", "##...##"}
Returns: 0
{"######", "######", "######", "######", "..##..", "######", "######", "##..##"}
Returns: 1
{".#.#.", "#####", ".#.#.", "#####", "#####", "#.#.#", "#####", "#####", "#####", "#####"}
Returns: 0
{"####.##", "######.", "#######", ".##.##.", "#######", "######.", "####.##"}
Returns: 0
{".########.", "##########", "##..##..##", "##########", ".########."}
Returns: 269
{"##.####.##", "##########", "####..####", "#.#.##.#.#", "##########"}
Returns: 1
{"###.########.###", "#.############.#", "######.##.######"}
Returns: 1
{"######", "####.#", ".#####", "##.#..", "####.#", "######", "######", "######"}
Returns: 0
{"###.###", "#######", "##.#.##", "###.###", "###.###", "##.#.##", "#######"}
Returns: 0
{"###.###.########.#####.####.#####.########.###.###"}
Returns: 0
{"############.#####.##.##..##.##.#####.############"}
Returns: 0
{"..", "..", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "..", ".."}
Returns: 21
{"######..##.#####.########", ".######.#####.#####.#####"}
Returns: 0
{"#######...########.####.#.##.#.###################"}
Returns: 0
{"#", "#", "#", "#", "#", "#", "#", "#", ".", "#", "#", "#", "#", "#", ".", "#", "#", ".", "#", "#", "#", "#", "#", "#", ".", ".", "#", "#", "#", "#", "#", "#", ".", "#", "#", ".", "#", "#", "#", "#", "#", ".", "#", "#", "#", "#", "#", "#", "#", "#"}
Returns: 0
{"################", ".###.##..##.###.", "################"}
Returns: 113
{"###.####.#######..##############..#######.####.###"}
Returns: 0
{"###", "###", "###", "###", "###", "###", "###", "###", "##.", "###", "###", "###", "..#", "#.#", "#.#", ".##"}
Returns: 0
{"#.####.#", "########", "########", "###..###", "########", ".######."}
Returns: 1
{"#####", "##.##", "#####", "##.##", "#.#.#", "#.#.#", "##.##", "#####", "##.##", "#####"}
Returns: 0
{"####.#.###", "##########", "#.#.#.##.#", "##########", "####.#.###"}
Returns: 0
{"####.######.####", "#####..##..#####", "################"}
Returns: 1
{"######.###########.##.##.####.########.##.###.####"}
Returns: 0
{"####.##.##.#.########################.#.##.##.####"}
Returns: 0
{"###.######.###.######.###", "###.######.###.######.###"}
Returns: 0
{"####.##########.#####.###", "##.############....######"}
Returns: 0
{"..###..", "#######", "#######", "###.###", "#######", "#######", "..###.."}
Returns: 734
{".......", "#######", "#######", "#######", "#######", "#######", "#######"}
Returns: 2947
{"..####..", "########", "########", "########", "########", ".######."}
Returns: 1
{".######.", "########", "####.###", "###.####", "########", ".######."}
Returns: 682
{"####", "####", "####", "####" }
Returns: 22