//http://poj.org/problem?id=1020
int a[12]; //记录小正方形的大小
int T,N,n; // N 为大正方形的边,n为小正方形个数
int flage;
int high[M]; //标记每一列填充后的高度
void dfs(int cur)
{
if(cur == n){
flage = 1; return ;
}
int min = 50,line;
for(int i = 1;i <= N;i++) if(min > high[i]){//每一次找到高度最小的列
min = high[i];
line = i;
}
int cnt = 1;
for(int i = line+1;i <= N;i++)
if(high[i] == high[i-1])
++cnt;
else break;
for(int i = 10;i >= 1;i--) if(a[i]){
if(i <= cnt && min+i <= N){
for(int j = 0;j < i;j++)
high[line+j] += i;
--a[i];
dfs(cur+1);
for(int j = 0;j < i;j++)
high[line+j] -= i;
++a[i];
}
}
}