/*
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.

    * Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions and the following disclaimer in the
    documentation and/or other materials provided with the distribution.

    * Neither the name of "The Computer Language Benchmarks Game" nor the
    name of "The Computer Language Shootout Benchmarks" nor the names of
    its contributors may be used to endorse or promote products derived
    from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
*/

/* The Computer Language Benchmarks Game
 * http://shootout.alioth.debian.org/
 *
 * contributed by The Go Authors.
 * based on meteor-contest.c by Christian Vosteen
 */

package main

import (
	"flag";
	"fmt";
)

var max_solutions = flag.Int("n", 2100, "maximum number of solutions")


func boolInt(b bool) int8 {
	if b {
		return 1
	}
	return 0;
}

/* The board is a 50 cell hexagonal pattern.  For    . . . . .
 * maximum speed the board will be implemented as     . . . . .
 * 50 bits, which will fit into a 64 bit long long   . . . . .
 * int.                                               . . . . .
 *                                                   . . . . .
 * I will represent 0's as empty cells and 1's        . . . . .
 * as full cells.                                    . . . . .
 *                                                    . . . . .
 *                                                   . . . . .
 *                                                    . . . . .
 */

var board uint64 = 0xFFFC000000000000

/* The puzzle pieces must be specified by the path followed
 * from one end to the other along 12 hexagonal directions.
 *
 *   Piece 0   Piece 1   Piece 2   Piece 3   Piece 4
 *
 *  O O O O    O   O O   O O O     O O O     O   O
 *         O    O O           O       O       O O
 *                           O         O         O
 *
 *   Piece 5   Piece 6   Piece 7   Piece 8   Piece 9
 *
 *    O O O     O O       O O     O O        O O O O
 *       O O       O O       O       O O O        O
 *                  O       O O
 *
 * I had to make it 12 directions because I wanted all of the
 * piece definitions to fit into the same size arrays.  It is
 * not possible to define piece 4 in terms of the 6 cardinal
 * directions in 4 moves.
 */

const (
	E	= iota;
	ESE;
	SE;
	S;
	SW;
	WSW;
	W;
	WNW;
	NW;
	N;
	NE;
	ENE;
	PIVOT;
)

var piece_def = [10][4]int8{
	[4]int8{E, E, E, SE},
	[4]int8{SE, E, NE, E},
	[4]int8{E, E, SE, SW},
	[4]int8{E, E, SW, SE},
	[4]int8{SE, E, NE, S},
	[4]int8{E, E, SW, E},
	[4]int8{E, SE, SE, NE},
	[4]int8{E, SE, SE, W},
	[4]int8{E, SE, E, E},
	[4]int8{E, E, E, SW},
}


/* To minimize the amount of work done in the recursive solve function below,
 * I'm going to allocate enough space for all legal rotations of each piece
 * at each position on the board. That's 10 pieces x 50 board positions x
 * 12 rotations.  However, not all 12 rotations will fit on every cell, so
 * I'll have to keep count of the actual number that do.
 * The pieces are going to be unsigned long long ints just like the board so
 * they can be bitwise-anded with the board to determine if they fit.
 * I'm also going to record the next possible open cell for each piece and
 * location to reduce the burden on the solve function.
 */
var (
	pieces		[10][50][12]uint64;
	piece_counts	[10][50]int;
	next_cell	[10][50][12]int8;
)

/* Returns the direction rotated 60 degrees clockwise */
func rotate(dir int8) int8	{ return (dir + 2) % PIVOT }

/* Returns the direction flipped on the horizontal axis */
func flip(dir int8) int8	{ return (PIVOT - dir) % PIVOT }


/* Returns the new cell index from the specified cell in the
 * specified direction.  The index is only valid if the
 * starting cell and direction have been checked by the
 * out_of_bounds function first.
 */
func shift(cell, dir int8) int8 {
	switch dir {
	case E:
		return cell + 1
	case ESE:
		if ((cell / 5) % 2) != 0 {
			return cell + 7
		} else {
			return cell + 6
		}
	case SE:
		if ((cell / 5) % 2) != 0 {
			return cell + 6
		} else {
			return cell + 5
		}
	case S:
		return cell + 10
	case SW:
		if ((cell / 5) % 2) != 0 {
			return cell + 5
		} else {
			return cell + 4
		}
	case WSW:
		if ((cell / 5) % 2) != 0 {
			return cell + 4
		} else {
			return cell + 3
		}
	case W:
		return cell - 1
	case WNW:
		if ((cell / 5) % 2) != 0 {
			return cell - 6
		} else {
			return cell - 7
		}
	case NW:
		if ((cell / 5) % 2) != 0 {
			return cell - 5
		} else {
			return cell - 6
		}
	case N:
		return cell - 10
	case NE:
		if ((cell / 5) % 2) != 0 {
			return cell - 4
		} else {
			return cell - 5
		}
	case ENE:
		if ((cell / 5) % 2) != 0 {
			return cell - 3
		} else {
			return cell - 4
		}
	}
	return cell;
}

/* Returns wether the specified cell and direction will land outside
 * of the board.  Used to determine if a piece is at a legal board
 * location or not.
 */
func out_of_bounds(cell, dir int8) bool {
	switch dir {
	case E:
		return cell%5 == 4
	case ESE:
		i := cell % 10;
		return i == 4 || i == 8 || i == 9 || cell >= 45;
	case SE:
		return cell%10 == 9 || cell >= 45
	case S:
		return cell >= 40
	case SW:
		return cell%10 == 0 || cell >= 45
	case WSW:
		i := cell % 10;
		return i == 0 || i == 1 || i == 5 || cell >= 45;
	case W:
		return cell%5 == 0
	case WNW:
		i := cell % 10;
		return i == 0 || i == 1 || i == 5 || cell < 5;
	case NW:
		return cell%10 == 0 || cell < 5
	case N:
		return cell < 10
	case NE:
		return cell%10 == 9 || cell < 5
	case ENE:
		i := cell % 10;
		return i == 4 || i == 8 || i == 9 || cell < 5;
	}
	return false;
}

/* Rotate a piece 60 degrees clockwise */
func rotate_piece(piece int) {
	for i := 0; i < 4; i++ {
		piece_def[piece][i] = rotate(piece_def[piece][i])
	}
}

/* Flip a piece along the horizontal axis */
func flip_piece(piece int) {
	for i := 0; i < 4; i++ {
		piece_def[piece][i] = flip(piece_def[piece][i])
	}
}

/* Convenience function to quickly calculate all of the indices for a piece */
func calc_cell_indices(cell []int8, piece int, index int8) {
	cell[0] = index;
	for i := 1; i < 5; i++ {
		cell[i] = shift(cell[i-1], piece_def[piece][i-1])
	}
}

/* Convenience function to quickly calculate if a piece fits on the board */
func cells_fit_on_board(cell []int8, piece int) bool {
	return !out_of_bounds(cell[0], piece_def[piece][0]) &&
		!out_of_bounds(cell[1], piece_def[piece][1]) &&
		!out_of_bounds(cell[2], piece_def[piece][2]) &&
		!out_of_bounds(cell[3], piece_def[piece][3])
}

/* Returns the lowest index of the cells of a piece.
 * I use the lowest index that a piece occupies as the index for looking up
 * the piece in the solve function.
 */
func minimum_of_cells(cell []int8) int8 {
	minimum := cell[0];
	for i := 1; i < 5; i++ {
		if cell[i] < minimum {
			minimum = cell[i]
		}
	}
	return minimum;
}

/* Calculate the lowest possible open cell if the piece is placed on the board.
 * Used to later reduce the amount of time searching for open cells in the
 * solve function.
 */
func first_empty_cell(cell []int8, minimum int8) int8 {
	first_empty := minimum;
	for first_empty == cell[0] || first_empty == cell[1] ||
		first_empty == cell[2] || first_empty == cell[3] ||
		first_empty == cell[4] {
		first_empty++
	}
	return first_empty;
}

/* Generate the unsigned long long int that will later be anded with the
 * board to determine if it fits.
 */
func bitmask_from_cells(cell []int8) uint64 {
	var piece_mask uint64;
	for i := 0; i < 5; i++ {
		piece_mask |= 1 << uint(cell[i])
	}
	return piece_mask;
}

/* Record the piece and other important information in arrays that will
 * later be used by the solve function.
 */
func record_piece(piece int, minimum int8, first_empty int8, piece_mask uint64) {
	pieces[piece][minimum][piece_counts[piece][minimum]] = piece_mask;
	next_cell[piece][minimum][piece_counts[piece][minimum]] = first_empty;
	piece_counts[piece][minimum]++;
}


/* Fill the entire board going cell by cell.  If any cells are "trapped"
 * they will be left alone.
 */
func fill_contiguous_space(board []int8, index int8) {
	if board[index] == 1 {
		return
	}
	board[index] = 1;
	if !out_of_bounds(index, E) {
		fill_contiguous_space(board, shift(index, E))
	}
	if !out_of_bounds(index, SE) {
		fill_contiguous_space(board, shift(index, SE))
	}
	if !out_of_bounds(index, SW) {
		fill_contiguous_space(board, shift(index, SW))
	}
	if !out_of_bounds(index, W) {
		fill_contiguous_space(board, shift(index, W))
	}
	if !out_of_bounds(index, NW) {
		fill_contiguous_space(board, shift(index, NW))
	}
	if !out_of_bounds(index, NE) {
		fill_contiguous_space(board, shift(index, NE))
	}
}


/* To thin the number of pieces, I calculate if any of them trap any empty
 * cells at the edges.  There are only a handful of exceptions where the
 * the board can be solved with the trapped cells.  For example:  piece 8 can
 * trap 5 cells in the corner, but piece 3 can fit in those cells, or piece 0
 * can split the board in half where both halves are viable.
 */
func has_island(cell []int8, piece int) bool {
	temp_board := make([]int8, 50);
	var i int;
	for i = 0; i < 5; i++ {
		temp_board[cell[i]] = 1
	}
	i = 49;
	for temp_board[i] == 1 {
		i--
	}
	fill_contiguous_space(temp_board, int8(i));
	c := 0;
	for i = 0; i < 50; i++ {
		if temp_board[i] == 0 {
			c++
		}
	}
	if c == 0 || (c == 5 && piece == 8) || (c == 40 && piece == 8) ||
		(c%5 == 0 && piece == 0) {
		return false
	}
	return true;
}


/* Calculate all six rotations of the specified piece at the specified index.
 * We calculate only half of piece 3's rotations.  This is because any solution
 * found has an identical solution rotated 180 degrees.  Thus we can reduce the
 * number of attempted pieces in the solve algorithm by not including the 180-
 * degree-rotated pieces of ONE of the pieces.  I chose piece 3 because it gave
 * me the best time ;)
 */
func calc_six_rotations(piece, index int) {
	cell := make([]int8, 5);
	for rotation := 0; rotation < 6; rotation++ {
		if piece != 3 || rotation < 3 {
			calc_cell_indices(cell, piece, int8(index));
			if cells_fit_on_board(cell, piece) && !has_island(cell, piece) {
				minimum := minimum_of_cells(cell);
				first_empty := first_empty_cell(cell, minimum);
				piece_mask := bitmask_from_cells(cell);
				record_piece(piece, minimum, first_empty, piece_mask);
			}
		}
		rotate_piece(piece);
	}
}

/* Calculate every legal rotation for each piece at each board location. */
func calc_pieces() {
	for piece := 0; piece < 10; piece++ {
		for index := 0; index < 50; index++ {
			calc_six_rotations(piece, index);
			flip_piece(piece);
			calc_six_rotations(piece, index);
		}
	}
}


/* Calculate all 32 possible states for a 5-bit row and all rows that will
 * create islands that follow any of the 32 possible rows.  These pre-
 * calculated 5-bit rows will be used to find islands in a partially solved
 * board in the solve function.
 */
const (
	ROW_MASK	= 0x1F;
	TRIPLE_MASK	= 0x7FFF;
)

var (
	all_rows	= [32]int8{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
		17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
	};
	bad_even_rows	[32][32]int8;
	bad_odd_rows	[32][32]int8;
	bad_even_triple	[32768]int8;
	bad_odd_triple	[32768]int8;
)

func rows_bad(row1, row2 int8, even bool) int8 {
	/* even is referring to row1 */
	var row2_shift int8;
	/* Test for blockages at same index and shifted index */
	if even {
		row2_shift = ((row2 << 1) & ROW_MASK) | 0x01
	} else {
		row2_shift = (row2 >> 1) | 0x10
	}
	block := ((row1 ^ row2) & row2) & ((row1 ^ row2_shift) & row2_shift);
	/* Test for groups of 0's */
	in_zeroes := false;
	group_okay := false;
	for i := uint8(0); i < 5; i++ {
		if row1&(1<<i) != 0 {
			if in_zeroes {
				if !group_okay {
					return 1
				}
				in_zeroes = false;
				group_okay = false;
			}
		} else {
			if !in_zeroes {
				in_zeroes = true
			}
			if (block & (1 << i)) == 0 {
				group_okay = true
			}
		}
	}
	if in_zeroes {
		return boolInt(!group_okay)
	}
	return 0;
}

/* Check for cases where three rows checked sequentially cause a false
 * positive.  One scenario is when 5 cells may be surrounded where piece 5
 * or 7 can fit.  The other scenario is when piece 2 creates a hook shape.
 */
func triple_is_okay(row1, row2, row3 int, even bool) bool {
	if even {
		/* There are four cases:
		 * row1: 00011  00001  11001  10101
		 * row2: 01011  00101  10001  10001
		 * row3: 011??  00110  ?????  ?????
		 */
		return ((row1 == 0x03) && (row2 == 0x0B) && ((row3 & 0x1C) == 0x0C)) ||
			((row1 == 0x01) && (row2 == 0x05) && (row3 == 0x06)) ||
			((row1 == 0x19) && (row2 == 0x11)) ||
			((row1 == 0x15) && (row2 == 0x11))
	}
	/* There are two cases:
	 * row1: 10011  10101
	 * row2: 10001  10001
	 * row3: ?????  ?????
	 */
	return ((row1 == 0x13) && (row2 == 0x11)) ||
		((row1 == 0x15) && (row2 == 0x11));
}

func calc_rows() {
	for row1 := int8(0); row1 < 32; row1++ {
		for row2 := int8(0); row2 < 32; row2++ {
			bad_even_rows[row1][row2] = rows_bad(row1, row2, true);
			bad_odd_rows[row1][row2] = rows_bad(row1, row2, false);
		}
	}
	for row1 := 0; row1 < 32; row1++ {
		for row2 := 0; row2 < 32; row2++ {
			for row3 := 0; row3 < 32; row3++ {
				result1 := bad_even_rows[row1][row2];
				result2 := bad_odd_rows[row2][row3];
				if result1 == 0 && result2 != 0 && triple_is_okay(row1, row2, row3, true) {
					bad_even_triple[row1+(row2*32)+(row3*1024)] = 0
				} else {
					bad_even_triple[row1+(row2*32)+(row3*1024)] = boolInt(result1 != 0 || result2 != 0)
				}

				result1 = bad_odd_rows[row1][row2];
				result2 = bad_even_rows[row2][row3];
				if result1 == 0 && result2 != 0 && triple_is_okay(row1, row2, row3, false) {
					bad_odd_triple[row1+(row2*32)+(row3*1024)] = 0
				} else {
					bad_odd_triple[row1+(row2*32)+(row3*1024)] = boolInt(result1 != 0 || result2 != 0)
				}
			}
		}
	}
}


/* Calculate islands while solving the board.
*/
func boardHasIslands(cell int8) int8 {
	/* Too low on board, don't bother checking */
	if cell >= 40 {
		return 0
	}
	current_triple := (board >> uint((cell/5)*5)) & TRIPLE_MASK;
	if (cell/5)%2 != 0 {
		return bad_odd_triple[current_triple]
	}
	return bad_even_triple[current_triple];
}


/* The recursive solve algorithm.  Try to place each permutation in the upper-
 * leftmost empty cell.  Mark off available pieces as it goes along.
 * Because the board is a bit mask, the piece number and bit mask must be saved
 * at each successful piece placement.  This data is used to create a 50 char
 * array if a solution is found.
 */
var (
	avail		uint16	= 0x03FF;
	sol_nums	[10]int8;
	sol_masks	[10]uint64;
	solutions	[2100][50]int8;
	solution_count	= 0;
)

func record_solution() {
	for sol_no := 0; sol_no < 10; sol_no++ {
		sol_mask := sol_masks[sol_no];
		for index := 0; index < 50; index++ {
			if sol_mask&1 == 1 {
				solutions[solution_count][index] = sol_nums[sol_no];
				/* Board rotated 180 degrees is a solution too! */
				solutions[solution_count+1][49-index] = sol_nums[sol_no];
			}
			sol_mask = sol_mask >> 1;
		}
	}
	solution_count += 2;
}

func solve(depth, cell int8) {
	if solution_count >= *max_solutions {
		return
	}

	for board&(1<<uint(cell)) != 0 {
		cell++
	}

	for piece := int8(0); piece < 10; piece++ {
		var piece_no_mask uint16 = 1 << uint(piece);
		if avail&piece_no_mask == 0 {
			continue
		}
		avail ^= piece_no_mask;
		max_rots := piece_counts[piece][cell];
		piece_mask := pieces[piece][cell];
		for rotation := 0; rotation < max_rots; rotation++ {
			if board&piece_mask[rotation] == 0 {
				sol_nums[depth] = piece;
				sol_masks[depth] = piece_mask[rotation];
				if depth == 9 {
					/* Solution found!!!!!11!!ONE! */
					record_solution();
					avail ^= piece_no_mask;
					return;
				}
				board |= piece_mask[rotation];
				if boardHasIslands(next_cell[piece][cell][rotation]) == 0 {
					solve(depth+1, next_cell[piece][cell][rotation])
				}
				board ^= piece_mask[rotation];
			}
		}
		avail ^= piece_no_mask;
	}
}

/* pretty print a board in the specified hexagonal format */
func pretty(b *[50]int8) {
	for i := 0; i < 50; i += 10 {
		fmt.Printf("%c %c %c %c %c \n %c %c %c %c %c \n", b[i]+'0', b[i+1]+'0',
			b[i+2]+'0', b[i+3]+'0', b[i+4]+'0', b[i+5]+'0', b[i+6]+'0',
			b[i+7]+'0', b[i+8]+'0', b[i+9]+'0')
	}
	fmt.Printf("\n");
}

/* Find smallest and largest solutions */
func smallest_largest() (smallest, largest *[50]int8) {
	smallest = &solutions[0];
	largest = &solutions[0];
	for i := 1; i < solution_count; i++ {
		candidate := &solutions[i];
		for j, s := range *smallest {
			c := candidate[j];
			if c == s {
				continue
			}
			if c < s {
				smallest = candidate
			}
			break;
		}
		for j, s := range *largest {
			c := candidate[j];
			if c == s {
				continue
			}
			if c > s {
				largest = candidate
			}
			break;
		}
	}
	return;
}

func main() {
	flag.Parse();
	calc_pieces();
	calc_rows();
	solve(0, 0);
	fmt.Printf("%d solutions found\n\n", solution_count);
	smallest, largest := smallest_largest();
	pretty(smallest);
	pretty(largest);
}
