这道题相对比较简单,直接误脑暴搜。
pe了两次。。。。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char n,block[5][4][4],info[5][2],area[4][4],ok;
void dfs(int index)
{
//printf("test%d",index);
if(ok==1)
return ;
int i,j,t,l,flag=1;
if(index==n)
{
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
if(area[i][j]==0)
flag=0;
}
if(flag==1)
{
ok=1;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
printf("%d",area[i][j]);
//if(i!=3)
printf("\n");
}
}
return ;
}
for(i=0;i<=4-info[index][0];i++)
{
for(j=0;j<=4-info[index][1];j++)
{
for(t=0;t<info[index][0];t++)
{
for(l=0;l<info[index][1];l++)
{
if(block[index][t][l]==1&&area[i+t][j+l]!=0)
goto next;
}
}
next:
if(t==info[index][0]&&l==info[index][1])
{
for(t=0;t<info[index][0];t++)
{
for(l=0;l<info[index][1];l++)
{
if(block[index][t][l]==1)
area[i+t][j+l]=index+1;
}
}
dfs(index+1);
for(t=0;t<info[index][0];t++)
{
for(l=0;l<info[index][1];l++)
{
if(block[index][t][l]==1)
area[i+t][j+l]=0;
}
}
}
}
}
}
int main()
{
int i,j,t,a,b,help=0;
while(scanf("%d",&n)&&n)
{
if(help!=0)
printf("\n");
help++;
memset(area,0,16);
ok=0;
for(i=0;i<n;i++)
{
scanf("%d %d",&a,&b);
info[i][0]=a,info[i][1]=b;
for(j=0;j<a;j++)
for(t=0;t<b;t++)
scanf("%1d",&block[i][j][t]);//%1d
}
dfs(0);
if(ok==0)
printf("No solution possible\n");
}
return 0;
}