题意:
给予一正方形 是否可以其他n个小正方形组成
从左到右 从上到下一个个填充小正方形
建立col数组保存每一行从左到右已经填了几个格子 填充时保证不出现镂空的情况
搜索从大到小各个小正方形循环
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define M 44
int col[M];
int cake[M],t;
int size,Num;
void yes()
{
printf("KHOOOOB!\n");
}
void no()
{
printf("HUTUTU!\n");
}
int minCol()
{
int ans=1,i;
for(i=2;i<=size;i++)
{
if(col[i]<col[ans])
{
ans=i;
}
}
return ans;
}
bool judge(int n)
{
if(n==Num)
{
return true;
}
int i,j,k;
int minc=minCol();
for(i=10;i>0;i--)
{
if(!cake[i])
{
continue ;
}
if(col[minc]+i<=size&&minc+i-1<=size)
{
int tot=0;
for(j=0;j<i;j++)
{
if(col[minc+j]==col[minc])
{
tot++;
}
}
if(tot==i)
{
for(j=0;j<i;j++)
{
col[minc+j]+=i;
}
cake[i]--;
if(judge(n+1))
{
return true;
}
for(j=0;j<i;j++)
{
col[minc+j]-=i;
}
cake[i]++;
}
}
}
return false;
}
int main()
{
int sum,T;
int i;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&size,&Num);
memset(col,0,sizeof(col));
memset(cake,0,sizeof(cake));
sum=0;
for(i=0;i<Num;i++)
{
scanf("%d",&t);
cake[t]++;
sum+=t*t;
}
if(sum!=size*size)
{
no();
continue;
}
if(judge(0))
{
yes();
}
else
{
no();
}
}
return 0;
}
本文介绍了一种通过不同大小的小正方形拼接成一个大正方形的算法实现。该算法使用回溯法进行搜索,确保每个小正方形都能正确放置且不重叠,最终判断是否能完成拼接。
806

被折叠的 条评论
为什么被折叠?



