Problem Statement
A yet unknown "LLL Company" wants to design a logo. After a long discussion, company designers decided that the logo should consist of three letters L drawn in some way.
To start with something, designers drew N rows of M points each, one under another, so that these points form a rectangular grid. They also painted each point either white or black. Here is an example of what they could get for N = 4 and M = 5:

Designers agreed to draw each letter L as a union of a horizontal and a vertical line segment intersecting at their left and bottom ends, respectively. The segments must have positive lengths, and their endpoints must be white grid points. All grid points that lie on the segments must be white as well. For example, here are two valid placements of a letter:


Note that neither the letters nor the grid can be rotated.
The final requirement is that the three letters should be disjoint. That is, no white point should lie on two segments belonging to different letters.
You are given the grid with N rows and M columns, encoded as a
Return the number of different possible logos with three L's drawn on them according to the requirements. Two logos are considered different if there is a pair of points that is connected by a line segment in exactly one of the logos.
Definition
- Class:
- ThreeLLogo
- Method:
- countWays
- Parameters:
- String[]
- Returns:
- long
- Method signature:
- long countWays(String[] grid)
- (be sure your method is public)
Constraints
- grid will contain between 2 and 30 elements, inclusive.
- All elements of grid will contain the same number of characters.
- Each element of grid will contain between 2 and 30 characters, inclusive.
- Each character of grid will be either '.' or '#'.
Examples
{"......", "......"}
Returns: 1
{".##..", ".....", ".#.#.", "#...#"}
Returns: 3
This is the example from the problem statement. The three possible logos look as follows:
{"....", "#...", "....", "..#."}
Returns: 4
{"..", ".."}
Returns: 0
Too small for a logo.
{".#.#", "....", ".#.#", "...."}
Returns: 12
{"######.#######", "######.#######", "#.####.#######", "#.####.#######", "#.####........", "#.############", "#.############", "#.############", "#.#####.######", "#.#####.######", "#.#####.######", "#....##.######", "#######.######", "#######.######", "#######.######", "#######.######", "#######.######", "#######.######", "#######......#", "##############"}
Returns: 37800
Corners of L's are identified uniquely in this case, but line segment lengths can vary.
{"#......", ".#....#", ".#.#...", "#....#.", ".##..#.", ".#.....", ".....#.", ".#.#...", ".#...#.", "..##..."}
Returns: 27750
{"...#..........................", "............#..#........#.....", ".#............................", "...#..........#...#..##.......", ".........#....#...#...#.....#.", "#...#......#...........#..#...", "#...##..#..#..#.....#.........", ".............##...............", ".....#..#..#..#...............", "......#................#......", "...#....#.........#.....#...#.", ".........#....................", ".........#.........##......#..", ".#.#..#.....#.#....#.#........", "....#.........#...#...........", "..##.....#.............#......", ".#............................", "......................#.......", "......#..............#.......#", "##..#.........#........#.....#", "......#.......#.....#.........", ".....#...#...#.#............#.", "......#..##....#..............", "....#....................#....", ".#..........................#.", ".............#..........#.....", ".#.........#..................", "................#.........##..", ".......................#.....#", ".............#...............#"}
Returns: 2178497179123
{"..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", ".............................."}
Returns: 441651982378068
{"..............................", "..............................", "............#.................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", ".............................."}
Returns: 427874762760002
{"..............................", "..............................", "..............................", "..............................", "..............................", "......#.......................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "...........#..................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", ".............................."}
Returns: 377561621299687
{".#............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", ".........................#....", "......#.......................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", ".............................."}
Returns: 373661609013076
{"..............................", "......................#.......", "..............................", "..............................", "..............................", "..............................", "..............................", "...........#..................", "..............................", "..............................", "..............................", "......#.......................", "..............................", "..............................", ".......................#......", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", ".............................."}
Returns: 347880742350076
{"......................#.......", "..............................", "#.............................", "..............................", "..............................", "..............................", "..............................", "..............................", ".............#................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", ".......#.........#............", "..............................", "..............................", "..............................", ".............................."}
Returns: 333865253226548
{"..............................", "..............................", "..............................", "..............................", "............................#.", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "......................#.......", "..............................", "..............................", ".............#................", "........#.....................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..........#..........#........", "..............................", "..............................", ".............................."}
Returns: 285096957115757
{"..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", ".#............................", ".................#.........#..", "..............................", "..............................", "..............................", "..............................", ".......#......................", "..............................", "..............................", "..............................", "..............................", "........#.....................", "......................#.......", "..............................", ".#............................", ".............................."}
Returns: 257190637445330
{"..............................", "......................#.......", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", ".......#......................", ".........#....................", "..............................", "..............................", "..............................", "............#.................", "..............................", "............#.................", "..............................", "...............#..............", "..............................", "..............................", "..............................", "...#..........................", "..............................", "..............................", "..............................", "..............................", ".....#........................", "..............................", ".............................."}
Returns: 235039876717286
{"..............................", "...................#..........", "..............................", ".............#................", "..............#...............", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "......................#.......", ".............................#", ".#............................", "..............................", "..........................#...", "..............................", "......................#.......", "..............................", "..............................", "..............................", "..............................", "..............................", "......#......................."}
Returns: 267228624510031
{"..............................", "................#.............", "..............................", "..............................", "..............................", "..........................#...", "..................#...........", "..............................", "..............................", "............................#.", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "............#.................", "..............................", "..............................", "..............................", "..............................", "..............................", "............#.................", "....#.........................", "..............................", "..........#...................", "..............................", ".........#.......#............", ".............................."}
Returns: 226022905803559
{"..............................", ".............................."}
Returns: 593775
{"..", "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", ".."}
Returns: 593775
{"..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", ".............................."}
Returns: 357484775736816
{".............................", ".............................", ".............................", ".............................", ".............................", ".............................", ".............................", ".............................", ".............................", ".............................", ".............................", ".............................", ".............................", ".............................", ".............................", ".............................", ".............................", ".............................", ".............................", ".............................", ".............................", ".............................", ".............................", ".............................", ".............................", ".............................", ".............................", ".............................", ".............................", "............................."}
Returns: 357484775736816
{".........................", ".........................", ".........................", ".........................", ".........................", ".........................", ".........................", ".........................", ".........................", ".........................", ".........................", ".........................", ".........................", ".........................", ".........................", ".........................", ".........................", ".........................", ".........................", ".........................", ".........................", ".........................", ".........................", "........................."}
Returns: 34878584048000
{"....................", "....................", "....................", "....................", "....................", "....................", "....................", "....................", "....................", "....................", "....................", "....................", "....................", "...................."}
Returns: 268796751132
{".#.#......#.#...#..#...#", "...###........#...#..#.#", ".....#..###........#....", ".#..#....#...#.....#....", "..................#.....", ".#.....##.....#..#......", ".....#.#.......#.......#", "..###........#.#....#...", ".............##...#.#...", ".............#..#.....#.", ".#.........###..........", "..###..###........#.#..#", "##........#............#", "..#..#....##..##...#.#..", "...#.#.....#...#.#....#.", "#.##...#.#.#........#..#", ".....#.#...#..#.##...#.#", "...#..#..#..#.#.#......#", "#........#.....#..##..##", "..#.##......#......##..."}
Returns: 1589840849
{"#################.####", "######################", "######################", "######################", "######################", "######################", "######################", "######################", "######################", "######################", "######################", "######################", "######################", "######################", "######################", "######################", "######################", "######################", "####################.#", "######################", "######################", "######################", "######################", "######################"}
Returns: 0
{"................", "...#............", "......#.#....#..", "......#........#", "....##...#..#.##", "..#....##.....#.", "......#........#", "##.......#...#..", "..#.......#.....", "...#....##......", "...#....#......#", ".#.#.....#......", "....#..#...#....", "#..#........#.#.", "........#....#..", ".#....#.........", ".....##..###...#", "..........####..", "##..#.....#....#", "..............#.", "...#......##....", "..#.......#.#..#", "...#...........#"}
Returns: 938340538
{"#########.", "#.#######.", "######...#", "#.########", "#.####.###", "#.###..###", "#########.", "##########", "#....##.##", "###..####.", "##.#.####.", "..##.....#", "..#####.##", "##.##.####", "###.###.##", "##.#.#.##.", "#######..#"}
Returns: 4
{".####.#####..#############", "#########.################", "###########.#.##.##.#####.", "#######.###.##########.###", ".########.########.#####.#", "########################.#", "#.#.######################"}
Returns: 0
{"#...#.#.#..#", "##.##..###..", ".#.#..######", "##.###.#.##.", "..#.###.####", "#######.##.#", "##.##.#.#..#", "##.#..#..#..", "#.####..###.", "#...#.####..", "#..#..#...#.", "####..####.#", "#.#....#####", "##.#...#.###", ".#..##...#.#", "...###....#.", "#.###...#.#.", "...#....#.##", ".##.#.#..##.", "..#..#.#...#", "#.##........", ".#.#.#.#.##.", ".##..##....#", "#.#..##.#...", ".#.##.#####.", "#.###...#.#."}
Returns: 109708
{"###.#.##...#", "##.##.###..#", "#..##.####..", "###.###..###", "###...#...##", ".##..#...#.#", ".......#.###", "##....#...##", "#...##....#.", "#..###...#..", "#.##..#.###.", "..##..#..#.#", ".#......#.#.", "..##.######.", "##.#..##.###", ".....##.#.#.", "#.#...#.#.##", ".##...#####.", ".#.#....###.", "..........#.", "..#.##..#...", "####......#.", ".#..####....", "#...#.#...##", "..###.###.#.", "#.#.###...#.", "####.##..##."}
Returns: 1160778
{"#.###.", "....##", "###.#.", "#.##..", ".#.##.", "#.##.#", "##....", "##.#.#", "...#.#", ".#.###", "#....#", "#.####", "..#...", "#.##.#", "#..#.#", "..###.", "##.##.", "....##", ".##..."}
Returns: 330
{".#.#.####..#####..###.", "..#####..#############", "######.######.####.###", ".#.##.###..#.##.###.#.", "#....#.#####.#####.###", ".##.####..########.#.#", "#.########.#####.####.", "..#..############..###"}
Returns: 0
{"......#...........#...........", ".....................#........"}
Returns: 198296
{".#############################", "..############################", "#..###########################", "##..##########################", "###..#########################", "####..########################", "#####..#######################", "######..######################", "#######..#####################", "########..####################", "#########..###################", "##########..##################", "###########..#################", "############..################", "#############..###############", "##############..##############", "###############..#############", "################..############", "#################..###########", "##################..##########", "###################..#########", "####################..########", "#####################..#######", "######################..######", "#######################..#####", "########################..####", "#########################..###", "##########################..##", "###########################..#", "############################.."}
Returns: 2925
{"..############################", "...###########################", "#...##########################", "##...#########################", "###...########################", "####...#######################", "#####...######################", "######...#####################", "#######...####################", "########...###################", "#########...##################", "##########...#################", "###########...################", "############...###############", "#############...##############", "##############...#############", "###############...############", "################...###########", "#################...##########", "##################...#########", "###################...########", "####################...#######", "#####################...######", "######################...#####", "#######################...####", "########################...###", "#########################...##", "##########################...#", "###########################...", "############################.."}
Returns: 313961
{"############################..", "###########################...", "##########################...#", "#########################...##", "########################...###", "#######################...####", "######################...#####", "#####################...######", "####################...#######", "###################...########", "##################...#########", "#################...##########", "################...###########", "###############...############", "##############...#############", "#############...##############", "############...###############", "###########...################", "##########...#################", "#########...##################", "########...###################", "#######...####################", "######...#####################", "#####...######################", "####...#######################", "###...########################", "##...#########################", "#...##########################", "...###########################", "..############################"}
Returns: 3654
{".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#."}
Returns: 0
{"##############################", "##############################", "##############################", "##############################", "##############################", "##############################", "##############################", "##############################", "##############################", "##############################", "##############################", "##############################", "##############################", "##############################", "##############################", "##############################", "##############################", "##############################", "##############################", "##############################", "##############################", "##############################", "##############################", "##############################", "##############################", "##############################", "##############################", "##############################", "##############################", "##############################"}
Returns: 0
{"..............................", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "..............................", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "..............................", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "..............................", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "..............................", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "..............................", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "..............................", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "..............................", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "..............................", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "..............................", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "..............................", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "..............................", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "..............................", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "..............................", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "..............................", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#"}
Returns: 6116303625978
{"..............................", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", "..............................", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", "..............................", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", "..............................", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", "..............................", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", "..............................", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", "..............................", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", "..............................", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", "..............................", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", "..............................", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", "..............................", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", "..............................", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", "..............................", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", "..............................", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", "..............................", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#."}
Returns: 4926158771716
{".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "..............................", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "..............................", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "..............................", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "..............................", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "..............................", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "..............................", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "..............................", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "..............................", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "..............................", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "..............................", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "..............................", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "..............................", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "..............................", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", "..............................", ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", ".............................."}
Returns: 7593366441920
{"#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", "..............................", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", "..............................", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", "..............................", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", "..............................", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", "..............................", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", "..............................", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", "..............................", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", "..............................", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", "..............................", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", "..............................", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", "..............................", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", "..............................", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", "..............................", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", "..............................", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", ".............................."}
Returns: 6116303625978
{"##", "##"}
Returns: 0
{".....", ".....", "....."}
Returns: 28
{".####", "..###", "#..##", "##..#", "###.."}
Returns: 0
{".#########", "..########", "#..#######", "##..######", "###..#####", "####..####", "#####..###", "######..##", "#######..#", "########.."}
Returns: 35
{".#########", ".#########", ".#########", "....######", "###.######", "###.######", "###....###", "######.###", "######.###", "######...."}
Returns: 576
{".#.#.#", "......"}
Returns: 1
{".#", "..", ".#", "..", ".#", ".."}
Returns: 1
{".....", ".###.", ".#.#.", ".###.", "....."}
Returns: 0
{"..##..", "......", "..##.."}
Returns: 12
{"....", ".##.", ".##.", "....", ".##.", ".##.", "....", ".##.", ".##.", "...."}
Returns: 324
{"..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "...#..........................", "..#.#.........................", "..#.##........................", "..#...#.......................", "...###........................", ".............................." }
Returns: 281188935704201
{"..........#.................", "..................#.........", "..........#.................", "..................#.........", "..........#.................", "..................#.........", "..........#.................", "..................#.........", "..........#.................", "..................#.........", "..........#.................", "..................#.........", "..........#.................", "..................#.........", "..........#.................", "..................#.........", "..........#.................", "..................#.........", "..........#.................", "..................#.........", "..........#.................", "..................#.........", "..........#.................", "..................#.........", "..........#.................", "..................#.........", "..........#.................", "..................#.........", "..........#.................", "..................#........." }
Returns: 42171807691266
{"..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", "..............................", ".............................." }
Returns: 441651982378068