poj1020--Anniversary Cake题解

本文介绍了一种通过搜索遍历的方式解决将多个小正方形拼接成一个大正方形的问题。该方法类似于俄罗斯方块游戏,但每次拼接时需找到当前最低的一列进行尝试。若尝试失败则进行回溯。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题:http://acm.pku.edu.cn/JudgeOnline/problem?id=1020

题目要求我们检测是否能将给定的多个小正方形拼成一个完整的大的正方形。

采用搜索遍历的方法:

拼凑的方法类似于俄罗斯方块游戏,不同的是每次拼凑的时候必须先找到高度最低的那一列拼凑,如果某一个小正方形不成功的话,则回溯。

#include<iostream> using namespace std; const int maxSize = 40; const int maxOfCakes = 10; int cakeSize,npieces; int cakes[maxOfCakes+1],len[maxSize+1]; bool Check(int usedNum) { if(usedNum==npieces) return true; int min = maxSize,ind = 0; for(int col=1;col<=cakeSize;col++) //找到高度最低的那一列 { if(min>len[col]) { min = len[col]; ind = col; } } for(int cs=1;cs<=maxOfCakes;cs++) { if(cakes[cs] && len[ind]+cs<=cakeSize) { int width = 0; for(int i=ind;i<=cakeSize;i++) { if(len[i]==len[ind]) width++; else break; } if(width>=cs) { cakes[cs]--; for(int i=ind;i<ind+cs;i++) len[i] += cs; if(Check(usedNum+1)) return true; for(int i=ind;i<ind+cs;i++) len[i] -= cs; cakes[cs]++; } } } return false; } int main() { int testNum; cin>>testNum; int side,sum; for(int i=0;i<testNum;i++) { for(int j=0;j<=maxSize;j++) len[j] = 0; for(int j=0;j<=maxOfCakes;j++) cakes[j] = 0; cin>>cakeSize>>npieces; sum = 0; for(int j=0;j<npieces;j++) { cin>>side; sum += side*side; cakes[side]++; } if(cakeSize*cakeSize==sum && Check(0)) { cout<<"KHOOOOB!"<<endl; } else { cout<<"HUTUTU!"<<endl; } } return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值