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; }
分类:
POJ
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 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)