Follows 387.c (Total 132 lines):

/* @JUDGE_ID:4461XX 387 C */
/* A */
#include<stdio.h>
#define N 100
int piece[N][4][4] , map[8][8] , used[N] ;
int print , type ;
void initial_map( void )
{
	int i , j ;

	for( i=0 ; i<4 ; i++ ){
		for( j=0 ; j<4 ; j++ ) map[i][j] = 0 ;
		for( j=4 ; j<8 ; j++ ) map[i][j] = -1 ;
	}
	for( i=4 ; i<8 ; i++ )
		for( j=0 ; j<8 ; j++ ) map[i][j] = -1 ;
}
void input( void )
{
	int i , j , k ;
	int row , col ;

	for( i=0 ; i<type ; i++ ){
		scanf( "%d %d\n" , &row , &col ) ;

		for( j=0 ; j<4 ; j++ )
			for( k=0 ; k<4 ; k++ ) piece[i][j][k] = 0 ;

		for( j=0 ; j<row ; j++ , scanf( "\n" ) )
			for( k=0 ; k<col ; k++ ){
				scanf( "%c" , &piece[i][j][k] ) ;
				piece[i][j][k] -= '0' ;
			}
	}
}
int CanPut( int k , int i , int j )
{
	int m , n , i1 , j1 ;

		for( m=0 , i1=i ; m<4 ; m++ , i1++ )
			for( n=0 , j1=j ; n<4 ; n++ , j1++ )
				if( piece[k][m][n] )
					if( map[i1][j1] ) return 0 ;

	return 1 ;
}
void Put( int k , int i , int j )
{
	int m , n , i1 , j1 ;
	for( m=0 , i1=i ; m<4 ; m++ , i1++ )
		for( n=0 , j1=j ; n<4 ; n++ , j1++ )
			if( piece[k][m][n] ) map[i1][j1] = k + 1 ;
}
void UnPut( int k , int i , int j )
{
	int m , n , i1 , j1 ;
	for( m=0 , i1=i ; m<4 ; m++ , i1++ )
		for( n=0 , j1=j ; n<4 ; n++ , j1++ )
			if( piece[k][m][n] ) map[i1][j1] = 0 ;
}
int IsFilled( void )
{
	int i , j ;
	for( i=0 ; i<4 ; i++ )
		for( j=0 ; j<4 ; j++ )
			if( !map[i][j] ) return 0 ;

	return 1 ;
}
void recursive( int level )
{
	int i , j , k ;
	if( print ) return ;
	if( level==type ){
		if( IsFilled() ){
			for( i=0 ; i<4 ; i++ ){
				for( j=0 ; j<4 ; j++ )
					printf( "%d", map[i][j] ) ;
				putchar( '\n' ) ;
			}
			print++ ;
		}
	}
	else
		for( j=0 ; j<4 ; j++ )
			for( i=0 ; i<4 ; i++ )
				for( k=0 ; k<type ; k++ )
					if( !used[k] )
						if( CanPut( k , i , j ) ){
							Put( k , i , j ) ;
							used[k] = 1 ;
							recursive( level+1 ) ;
							used[k] = 0 ;
							UnPut( k , i , j ) ;
						}
}
void main( void )
{
	int i , j , k , j2 ;
	int firstOutput=1;
/*	freopen( "C:\\windows\\desktop\\387.in" , "r" , stdin ) ;
	freopen( "C:\\windows\\desktop\\387.out" , "w" , stdout ) ;*/
	while( 1 ){
		scanf( "%d" , &type ) ;
		if( !type ) break ;

		if( firstOutput )
			firstOutput = 0;
		else
			putchar( '\n' );

		input() ;
		initial_map() ;
		print = 0 ;

		for( i=0 ; i<N ; i++ ) used[i] = 0 ; /*initial*/
		for( j=0 ; j<4 ; j++ )
			for( i=0 ; i<4 ; i++ )
				for( k=0 ; k<type ; k++ )
					if( !used[k] )
						if( CanPut( k , i , j ) ){
							Put( k , i , j ) ;
							used[k] = 1 ;
							recursive( 1 ) ;
							used[k] = 0 ;
							UnPut( k , i , j ) ;
						}

		if( !print ) puts( "No solution possible" ) ;
	}
}
/* @END_OF_SOURCE_CODE */

Back to statistics
Ya-Lin Huang (C)
huangyl@gmail.com