1020 Anniversary Cake dfs

题目:

描述
Nahid Khaleh决定邀请“Shahr-e Ghashang”的孩子参加她的结婚纪念日。她想准备一个已知大小的方形巧克力蛋糕。她要求每个被邀请的人确定他/她想要的那块蛋糕的大小(也应该是方形的)。她知道Kavoosi先生不会浪费任何蛋糕。她想知道她是否可以制作一个这样大小的方形蛋糕,它可以满足所有人的要求,并且没有任何浪费。
输入
输入文件的第一行包含一个整数t(1≤t≤10),测试用例的数量,然后是每个测试用例的输入数据。每个测试用例由一行包含一个整数s,即蛋糕的一侧,后跟一个整数n(1≤n≤16),蛋糕块的数量,后跟n个整数(在1..10范围内) )指定每件的侧面。
输出
每个测试用例应该有一个输出行,其中包含一个单词KHOOOOB!还是HUTUTU!取决于蛋糕是否可以切成特定尺寸的碎片而没有任何浪费。
样例输入
2
4 8 1 1 1 1 1 3 1 1
5 6 3 3 2 1 1 1
样例输出
KHOOOOB!
HUTUTU!

const int MAXN=60;
int square[MAXN];//侧面长为i的小蛋糕个数
int col[MAXN];//大蛋糕的每一列被填充的格子数
int n,m;
bool dfs(int num){
    if(num==n)
        return false;
    int minval=m;
    int minord=0;
    for(int i=1;i<=m;i++){
        if(col[i]<minval){
            minval=col[i];//从列号最小的开始填
            minord=i;//记下最小的列号
        }
    }
    int minnum;
    for(int i=minord;i<=m;i++){
        if(col[i]==minval)//填充最小列的行的个数
            minnum++;
        else
            break;
    }
    for(int i=10;i>=1;i--){
        if(square[i]<0)
            continue;
 if (i <= m - col[minOrd] && i <= minNum)
        {
            square[i]--;
            for (int j = minOrd;j < minOrd + i;j++)
                col[j] += i;
            if (DFS(num + 1))
                return true;
            for (int j = minOrd;j < minOrd + i;j++)
                col[j] -= i;
            square[i]++;
        }
    }
    return false;
}
int main()
{
    int t;
    int wid;
    scanf("%d", &t);
    while (t--)
    {
        int sum = 0;
        memset(square, 0, sizeof(square));
        memset(col, 0, sizeof(col));
        scanf("%d%d", &m, &n);
        for (int i = 1;i <= n;i++)
        {
            cin >> wid;
            square[wid]++;
            sum += wid * wid;
        }
        if (sum != m * m)
        {
            cout << "HUTUTU!" << endl;
            continue;
        }
        if (DFS(0))
            cout << "KHOOOOB!" << endl;
        else
            cout << "HUTUTU!" << endl;
    }
    return 0;

}

 

posted on 2019-09-14 02:01  姜姜糖  阅读(206)  评论(0编辑  收藏  举报