poj 1020(回溯+dfs)

复制代码
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int d[11],n,s,visit[50];
bool dfs(int num){
    int i,j,wide;
    if(num==n)return true;
    int pos;
    int minx = 100;
    for(j=1;j<=s;j++){
        // pos选取visit最小的点 
        if(minx>visit[j]){
            pos = j;
            minx = visit[j];
        }
    }
    for(i=10;i>0;i--){
        if(d[i]==0)continue;
        // 如果需要放置的蛋糕块的边长i小于剩余高度s-visit[pos];而且pos+i-1不越界 
        if(s-visit[pos]>=i&&pos+i-1<=s){
            wide = 0;
            for(j=pos;j<pos+i;j++){
//                if(visit[j]<=visit[pos]){
//                    wide++;
//                    continue;
//                }
//                break;
                // 如果所有经过点的高度都小于等于pos的高度,否则退出循环 
                if(visit[j]>visit[pos])break;
                wide++;
            }
            // 如果可以装下蛋糕块 
            if(wide==i){
                // 蛋糕块数减一 
                d[i]--; 
                // 将经过点的visit值都加i 
                for(j=pos;j<pos+i;j++)
                    visit[j] += i;
//                for(j=1;j<=s;j++)
//                    cout<<visit[j]<<" ";
//                cout<<endl<<num<<endl;
                // 递归 
                if(dfs(num+1))return true;
                //回溯 
                d[i]++;
                for(j=pos;j<pos+i;j++)
                    visit[j] -= i;
            }
        }
    }
    return false; 
}
int main(){
    int t,i,tmp,count,sum;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&s,&n);
        memset(d,0,sizeof(d));
        memset(visit,0,sizeof(visit));
        count = 0;
        sum = 0;
        for(i=0;i<n;i++){
            scanf("%d",&tmp); 
            if(tmp>s/2)count++;
            d[tmp]++;
            sum += tmp*tmp;
        }
        // 如果有两个或两个以上蛋糕块的边长大于蛋糕边长
        // 或者如果蛋糕块的总面积不等于蛋糕总面积 
        if(count>1||s*s!=sum){
            printf("HUTUTU!\n");
        }
//        for(i=0;i<=10;i++)
//            cout<<d[i]<<endl;
        else
            if(dfs(0))printf("KHOOOOB!\n");
            else printf("HUTUTU!\n");
    }
    return 0;
}
复制代码

 

posted @   智人心  阅读(60)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示