Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.*;
- public final class Water {
- static final int[] ROW_FILLS = { 4, 5, 6, 5, 6, 4, 7, 7, 4, 5, 7, 6 };
- static final int[] COL_FILLS = { 4, 6, 5, 4, 8, 7, 4, 4, 6, 6, 6, 6 };
- static final Piece[] Pcs = {
- new Piece( new Row[] { // 1
- new Row( 3, new int[] { 2, 3 } ), new Row( 2, new int[] { 2 } ), new Row( 1, new int[] { 1, 2, 3 } )
- } ),
- new Piece( new Row[] { // 2
- new Row( 2, new int[] { 3, 4, 5 } ), new Row( 1, new int[] { 4 } )
- } ),
- new Piece( new Row[] { // 3
- new Row( 3, new int[] { 5, 6 } ), new Row( 2, new int[] { 6 } ), new Row( 1, new int[] { 5, 6 } )
- } ),
- new Piece( new Row[] { // 4
- new Row( 1, new int[] { 7, 8, 9, 10} )
- } ),
- new Piece( new Row[] { // 5
- new Row( 3, new int[] { 10 } ), new Row( 2, new int[] { 9, 10, 11 } ), new Row( 1, new int[] { 11, 12 } )
- } ),
- new Piece( new Row[] { // 6
- new Row( 3, new int[] { 1 } ), new Row( 2, new int[] { 1 } )
- }, 1 ),
- new Piece( new Row[] { // 7
- new Row( 4, new int[] { 6, 7 } ), new Row( 3, new int[] { 7 } ), new Row( 2, new int[] { 7, 8 } )
- } ),
- new Piece( new Row[] { // 8
- new Row( 5, new int[] { 12 } ), new Row( 4, new int[] { 12 } ), new Row( 3, new int[] { 11, 12 } ),
- new Row( 2, new int[] { 12 } )
- } ),
- new Piece( new Row[] { // 9
- new Row( 5, new int[] { 1, 3 } ), new Row( 4, new int[] { 1, 2, 3, 4 } ), new Row( 3, new int[] { 4 } )
- }, 2 ),
- new Piece( new Row[] { // 10
- new Row( 4, new int[] { 9, 10, 11 } ), new Row( 3, new int[] { 8, 9 } )
- } ),
- new Piece( new Row[] { // 11
- new Row( 6, new int[] { 5 } ), new Row( 5, new int[] { 4, 5, 6, 7 } ), new Row( 4, new int[] { 5 } )
- }, 3 ),
- new Piece( new Row[] { // 12
- new Row( 6 , new int[] { 9, 10 } ), new Row( 5, new int[] { 8, 9 } ), new Row( 4, new int[] { 8 } )
- } ),
- new Piece( new Row[] { // 13
- new Row( 7, new int[] { 1 } ), new Row( 6, new int[] { 1, 2, 3, 4 } ), new Row( 5, new int[] { 2 } )
- }, 4 ),
- new Piece( new Row[] { // 14
- new Row( 8, new int[] { 11 } ), new Row( 7, new int[] { 10, 11 } ), new Row( 6, new int[] { 11 } ),
- new Row( 5, new int[] { 10, 11 } )
- } ),
- new Piece( new Row[] { // 15
- new Row( 8, new int[] { 4 } ), new Row( 7, new int[] { 4, 5, 6 } ), new Row( 6, new int[] { 6 } )
- }, 5 ),
- new Piece( new Row[] { // 16
- new Row( 9, new int[] { 8 } ), new Row( 8, new int[] { 6, 7, 8 } ), new Row( 7, new int[] { 7 } ),
- new Row( 6, new int[] { 7, 8 } )
- } ),
- new Piece( new Row[] { // 17
- new Row( 8 , new int[] { 12 } ), new Row( 7, new int[] { 12 } ), new Row( 6, new int[] { 12 } )
- } ),
- new Piece( new Row[] { // 18
- new Row( 10, new int[] { 1, 2 } ), new Row( 9, new int[] { 2 } ), new Row( 8, new int[] { 2 } ),
- new Row( 7, new int[] { 2, 3 } )
- }, 6 ),
- new Piece( new Row[] { // 19
- new Row( 8, new int[] { 9, 10 } ), new Row( 7, new int[] { 8, 9 } )
- } ),
- new Piece( new Row[] { // 20
- new Row( 9, new int[] { 1 } ), new Row( 8, new int[] { 1 } )
- }, 7 ),
- new Piece( new Row[] { // 21
- new Row( 9, new int[] { 3, 4, 5 } ), new Row( 8, new int[] { 3, 5 } )
- } ),
- new Piece( new Row[] { // 22
- new Row( 11, new int[] { 5, 6, 7 } ), new Row( 10, new int[] { 6 } ), new Row( 9, new int[] { 6 } )
- }, 8 ),
- new Piece( new Row[] { // 23
- new Row( 12, new int[] { 8 } ), new Row( 11, new int[] { 8 } ), new Row( 10, new int[] { 7, 8 } ),
- new Row( 9, new int[] { 7 } )
- } ),
- new Piece( new Row[] { // 24
- new Row( 11, new int[] { 9 } ), new Row( 10, new int[] { 9, 10 } ), new Row( 9, new int[] { 9 } )
- } ),
- new Piece( new Row[] { // 25
- new Row( 11, new int[] { 12 } ), new Row( 10, new int[] { 12 } ), new Row( 9, new int[] { 10, 11, 12 } )
- } ),
- new Piece( new Row[] { // 26
- new Row( 11, new int[] { 2, 3 } ), new Row( 10, new int[] { 3, 4, 5 } )
- }, 9 ),
- new Piece( new Row[] { // 27
- new Row( 12, new int[] { 11, 12 } ), new Row( 11, new int[] { 10, 11 } ), new Row( 10, new int[] { 11 } )
- } ),
- new Piece( new Row[] { // 28
- new Row( 12, new int[] { 1, 2, 3 } ), new Row( 11, new int[] { 1 } )
- }, 10 ),
- new Piece( new Row[] { // 29
- new Row( 12, new int[] { 4, 5, 6, 7 } ), new Row( 11, new int[] { 4 } )
- } ),
- new Piece( new Row[] { // 30
- new Row( 12, new int[] { 9, 10 } )
- }, 11 )
- };
- public static void main( String[] sArgs ) {
- final int[] iRowSums = new int[12],
- iColSums = new int[12];
- final Deque<StackElement> SEs = new LinkedList<>();
- SEs.push( new StackElement( 1 ) );
- pieceHeap: while( !SEs.isEmpty() ) {
- StackElement SE = SEs.peek();
- if( !SE.isMutable() ) {
- SEs.pop();
- continue;
- }
- while( SE.isMutable() ) {
- boolean isOverfull = SE.fillToNextLevel( iRowSums, iColSums );
- if( !isOverfull ) {
- if( SE.iPieceIndex == 30 ) {
- if( iRowSums[11] == ROW_FILLS[11] )
- break pieceHeap;
- continue;
- }
- int iDeadRow = Pcs[SE.iPieceIndex + 1 - 1].iDeadRow;
- if( iDeadRow != -1 && iRowSums[iDeadRow - 1] < ROW_FILLS[iDeadRow - 1] )
- break;
- SEs.push( new StackElement( SE.iPieceIndex + 1 ) );
- continue pieceHeap;
- }
- }
- SE.repeal( iRowSums, iColSums );
- SEs.pop();
- }
- if( SEs.isEmpty() )
- System.out.println( "Unable to find solution." );
- else {
- System.out.println( "Found solution:\n" );
- Iterator<StackElement> I_SE = SEs.descendingIterator();
- while( I_SE.hasNext() )
- System.out.println( "\t" + I_SE.next().fillString() );
- }
- }
- static class StackElement {
- final int iPieceIndex;
- final Piece Pc;
- int iFillLevel;
- StackElement( int iPieceIndex ) {
- this.iPieceIndex = iPieceIndex;
- Pc = Pcs[iPieceIndex - 1];
- iFillLevel = -1;
- }
- boolean isMutable() {
- return iFillLevel != 0;
- }
- boolean fillToNextLevel( int[] iRowSums, int[] iColSums ) {
- if( iPieceIndex == 9 ) {
- /* Hack for piece 9, which doesn't obey the canonical fill rules (that I'd initially assumed). */
- if( iFillLevel == -1 ) {
- iRowSums[2] += 1;
- iRowSums[3] += 4;
- iRowSums[4] += 2;
- iColSums[0] += 2;
- iColSums[1] += 1;
- iColSums[2] += 2;
- iColSums[3] += 2;
- iFillLevel = 5;
- } else if( iFillLevel == 5 ) {
- iRowSums[2] -= 1;
- iColSums[3] -= 1;
- iFillLevel = 4;
- } else if( iFillLevel == 4 ) {
- iRowSums[3] -= 4;
- iColSums[0] -= 1;
- iColSums[1] -= 1;
- iColSums[2] -= 1;
- iColSums[3] -= 1;
- iFillLevel = 3;
- } else if( iFillLevel == 3 ) {
- iRowSums[4] -= 1;
- iColSums[2] -= 1;
- iFillLevel = 2;
- } else if( iFillLevel == 2 ) {
- iColSums[2] += 1;
- iColSums[0] -= 1;
- iFillLevel = 1;
- } else if( iFillLevel == 1 ) {
- iColSums[2] -= 1;
- iRowSums[4] -= 1;
- iFillLevel = 0;
- }
- for( int iRow = 2; iRow <= 4; iRow++ )
- if( iRowSums[iRow] > ROW_FILLS[iRow] )
- return true;
- for( int iCol = 0; iCol <= 3; iCol++ )
- if( iColSums[iCol] > COL_FILLS[iCol] )
- return true;
- return false;
- }
- if( iFillLevel == -1 ) {
- boolean isOverfull = false;
- iFillLevel = Pc.Rws.length;
- for( Row Rw : Pc.Rws ) {
- iRowSums[Rw.iRow - 1] += Rw.iCols.length;
- if( iRowSums[Rw.iRow - 1] > ROW_FILLS[Rw.iRow - 1] )
- isOverfull = true;
- for( int iCol : Rw.iCols )
- if( ++iColSums[iCol - 1] > COL_FILLS[iCol - 1] )
- isOverfull = true;
- }
- return isOverfull;
- }
- iFillLevel--;
- Row Rw = Pc.Rws[iFillLevel];
- iRowSums[Rw.iRow - 1] -= Rw.iCols.length;
- for( int iCol : Rw.iCols )
- iColSums[iCol - 1]--;
- for( int iRow = 0; iRow < iFillLevel; iRow++ ) {
- Rw = Pc.Rws[iRow];
- if( iRowSums[Rw.iRow - 1] > ROW_FILLS[Rw.iRow - 1] )
- return true;
- for( int iCol : Rw.iCols )
- if( iColSums[iCol - 1] > COL_FILLS[iCol - 1] )
- return true;
- }
- return false;
- }
- void repeal( int[] iRowSums, int[] iColSums ) {
- for( int iRow = 0; iRow < iFillLevel; iRow++ ) {
- Row Rw = Pc.Rws[iRow];
- iRowSums[Rw.iRow - 1] -= Rw.iCols.length;
- for( int iCol : Rw.iCols )
- iColSums[iCol - 1]--;
- }
- }
- String fillString() {
- return "Piece " + iPieceIndex + " filled to level " + iFillLevel + ".";
- }
- }
- static class Piece {
- final Row[] Rws;
- final int iDeadRow;
- Piece( Row[] Rws ) {
- this( Rws, -1 );
- }
- Piece( Row[] Rws, int iDeadRow ) {
- this.Rws = Rws;
- this.iDeadRow = iDeadRow;
- }
- }
- static class Row {
- final int iRow;
- final int[] iCols;
- Row( int iRow, int[] iCols ) {
- this.iRow = iRow;
- this.iCols = iCols;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement