Description
Input
Output
Sample Input
4
2 3
111
101
4 2
01
01
11
01
2 1
1
1
3 2
10
10
11
4
1 4
1111
1 4
1111
1 4
1111
1 4
1111
4
1 4
1111
1 4
1111
1 4
1111
2 3
111
001
Sample Output
Yes, only one!
1112
1412
3422
3442
Yes, many!
No solution
Data Constraint
30%的数据,N<5
100%的数据,N<=16
Solution
这题咋一看没什么思路,行!上暴力!~稍不留神就过了。
每种位置枚举填哪种拼图,查看最后是否拼成即可!
码农题,复杂度O(?),由于只有 4*4 ,可以轻松AC。
Code
#include<cstdio>
#include<cstring>
using namespace std;
int n,ans;
bool pd;
int r[17],c[17],a[17];
int bz[17][17],map[17][17];
bool s[17][17][17],p[17];
inline bool judge(int k,int x,int y)
{
for(int i=1;i<=r[k];i++)
for(int j=1;j<=c[k];j++)
{
int xx=x+i-1,yy=y+j-1;
if(xx>4 || yy>4) return false;
if(s[k][i][j] && bz[xx][yy]) return false;
}
return true;
}
inline void fill(int k,int x,int y,bool b)
{
for(int i=1;i<=r[k];i++)
for(int j=1;j<=c[k];j++)
if(s[k][i][j]) bz[x+i-1][y+j-1]=b?k:0;
}
inline void dfs(int z)
{
if(pd) return;
if(!z)
{
if(++ans>1)
{
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
if(bz[i][j]!=map[i][j])
{
pd=true;
break;
}
if(!pd) ans--;
}else
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
map[i][j]=bz[i][j];
return;
}
for(int k=1;k<=n;k++)
if(!p[k])
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
if(!bz[i][j] && judge(k,i,j))
{
p[k]=true;
fill(k,i,j,true);
dfs(z-a[k]);
fill(k,i,j,false);
p[k]=false;
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
int sum=ans=pd=0;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&r[i],&c[i]);
a[i]=0;
for(int j=1;j<=r[i];j++)
for(int k=1;k<=c[i];k++)
{
char ch=getchar();
while(ch!='0' && ch!='1') ch=getchar();
s[i][j][k]=ch=='1';
if(ch=='1') a[i]++;
}
sum+=a[i];
}
if(sum!=16)
{
printf("No solution\n");
continue;
}
dfs(16);
if(ans>1)
{
printf("Yes, many!\n");
continue;
}
if(!ans)
{
printf("No solution\n");
continue;
}
printf("Yes, only one!\n");
for(int i=1;i<=4;i++)
{
for(int j=1;j<=4;j++) printf("%d",map[i][j]);
printf("\n");
}
}
return 0;
}