Chinaunix首页 | 论坛 | 博客
  • 博客访问: 198265
  • 博文数量: 67
  • 博客积分: 2970
  • 博客等级: 少校
  • 技术积分: 685
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-23 11:36
文章分类

全部博文(67)

文章存档

2012年(2)

2011年(19)

2010年(46)

我的朋友

分类: C/C++

2010-09-21 14:55:22

 


#include<stdio.h>
#include<string.h>

int size,n,cake[11],col[41];
bool exist;

void dfs(int depth)
{
    if(depth==n)
    {
        exist=true;
        return;
    }

    int startX=41,startY,len=0;        //startX,stratY记录大正方形最上面未利用的空白间隙的位置

    for(int i=1;i<=size;i++)        
    {                                
        if(startX>col[i])
        {
            startX=col[i];
            startY=i;
        }
    }
    for(int i=startY;i<=size;i++)    //len记录间隙空白间隙的横向宽度,下面startX+边长<=size为纵向约束

    {
        if(col[i]>startX) break;
        len++;
    }

    for(int i=10;i>0;i--)    
    {
        if(cake[i]>0&&startX+i<=size&&i<=len)    //存在某种小正方形能容纳在最上面的空白间隙中    

        {
            for(int j=i-1;j>=0;j--) col[startY+j]+=i;
            cake[i]--;
            dfs(depth+1);
            if(!exist)            
            {
                cake[i]++;
                for(int j=i-1;j>=0;j--) col[startY+j]-=i;
            }
        }
    }
}

int main()
{
    int cases;
    scanf("%d",&cases);
    while(cases--)
    {
        scanf("%d%d",&size,&n);     //用size个竖条来模拟大正方形

        memset(cake,0,sizeof(cake));        
        memset(col,0,sizeof(col));
        int sum=0;
        for(int i=1;i<=n;i++)
        {
            int kind;
            scanf("%d",&kind);
            sum+=kind*kind;
            cake[kind]++;        //以边长分类记录小正方形

        }
        if(size*size!=sum)    
        {
            printf("HUTUTU!\n");
        }
        else
        {
            exist=false;
            dfs(0);
            if(exist) printf("KHOOOOB!\n");
            else printf("HUTUTU!\n");
        }
    }
    return 0;
}


阅读(918) | 评论(0) | 转发(0) |
0

上一篇:pku1011 Sticks

下一篇:pku1691 Painting A Board

给主人留下些什么吧!~~