题意不再详述;
思路:将最后的正方形看做154*154个格子,直接枚举每个合法现有正方形暴力正确结果,暴力方式很重要,具体看代码实现;
//2 5 9 11 16 17 19 21 22 24 26 30 31 33 35 36 41 46 47 50 52 61
#include <iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int s[160][160],len;
int vis[100];
int a[19]={2,5,9,11,16,17,19,21,22,24,26,30,31,33,35,36,41,50,52};
int ans[70],flag1;
void init()
{
for (int i=1;i<=47;i++)
for (int j=1;j<=47;j++)
s[i][j]=47;
for (int i=1;i<=46;i++)
for (int j=47+1;j<=47+46;j++)
s[i][j]=46;
for (int i=1;i<=61;i++)
for (int j=47+46+1;j<=47+46+61;j++)
s[i][j]=61;
}
int check(int x,int y,int po)
{
for (int i=x;i<=x+a[po]-1;i++)
for (int j=y;j<=y+a[po]-1;j++)
if (s[i][j]!=0)
return 0;
return 1;
}
void print()
{
for (int j=1;j<=len;j++)
cout<<s[len][j];
cout<<endl;
}
void dfs(int x,int y)
{
if (x>154)
{
print();
return;
}
if (s[x][y]!=0)
{
if (y==154)
dfs(x+1,1);
else
dfs(x,y+1);
}
for (int i=0;i<19;i++)
{
if (!vis[i]&&x+a[i]-1<=154&&y+a[i]-1<=154&&check(x,y,i))
{
for (int j=x;j<=x+a[i]-1;j++)
for (int k=y;k<=y+a[i]-1;k++)
s[j][k]=a[i];
vis[i]=1;
if (y==154)
dfs(x+1,1);
else
dfs(x,y+1);
vis[i]=0;
for (int j=x;j<=x+a[i]-1;j++)
for (int k=y;k<=y+a[i]-1;k++)
s[j][k]=0;
}
}
}
int main()
{
len=154;
flag1=0;
memset(s,0,sizeof(s));
memset(vis,0,sizeof(vis));
init();
int cnt=0;
dfs(47,48);
return 0;
}