Question:http://poj.org/problem?id=1020
问题点:DFS。
 Memory: 260K        Time: 47MS
Language: C++ Result: Accepted #include <iostream>
using namespace std; int mat[];//按列记录小块Cake填充状态
int side[];//小块Cake边长
bool visit[];//小块Cake是否已使用
int width,cnt;//大块Cake边长 小块Cake数量
bool flag;//是否能被填充标志
int cmp(const void* a,const void* b)
{
return *(int*)b - *(int*)a;//降序排列
}
//状态更新: pn为1时,从x列开始填充第idx块Cake,并判断是否能填充进去
// pn为-1时,从x列开始清除第idx块Cake
bool update(int idx,int x,int pn)
{
int i,temp = mat[x];
if(pn == )
{
//填充第idx块Cake后,长宽不能超过边界
if(side[idx] + x > width || mat[x] + side[idx] > width) return false;
//判断x列到x+side[idx]-1列 是否同高度
for(i=;i<side[idx];i++)
{
if(temp != mat[x+i]) return false;
}
visit[idx] = true;
}
else
{
visit[idx] = false;
}
for(i=;i<side[idx];i++)
{
mat[x+i] += side[idx]*pn;
}
return true;
}
//获取当前最小高度处的最小列,填充顺序为"从低到高,从左到右"
int getLowX()
{
int i,temp=;
for(i=;i<width;i++)
{
temp =(temp<mat[i]?temp:mat[i]);
}
for(i=;i<width && temp!= mat[i];i++);
return i;
}
//idx为已填充数 ,x为小块Cake编号
void dfs(int idx,int x)
{
if(idx == cnt) {//当全部填充完毕时,返回true
flag = true;
return;
}
for(int i=,w=;i<cnt;i++)
{
if(visit[i]) continue;//已填充的不再填充
if(w == side[i]) continue; else w = side[i];//同边长的不重复填充
if(update(i,x,))//在x列填充第i块Cake
{
dfs(idx+,getLowX());
if(flag) return;
update(i,x,-);//在x列清除第i块Cake
}
}
}
int main()
{
int eg;
cin>>eg;
while(eg--)
{
int i,j,k;
memset(mat,,sizeof(mat));
memset(side,,sizeof(side));
memset(visit,,sizeof(visit));
flag = false;
cin>>width;
cin>>cnt;
for(i=;i<cnt;i++)
{
cin>>side[i];
}
qsort(side,cnt,sizeof(int),cmp);//排序用于去重
dfs(,);
if(flag) cout<<"KHOOOOB!"<<endl;
else cout<<"HUTUTU!"<<endl;
}
//system("pause");
return ;
}

北大ACM(POJ1020-Anniversary Cake)的更多相关文章

  1. POJ1020 Anniversary Cake

    题目来源:http://poj.org/problem?id=1020 题目大意:有一块边长为s的正方形大蛋糕,有n个客人,每个客人想分一块边长为si的正方形蛋糕.求这块大蛋糕能否恰好满足所有客人的需 ...

  2. 【DFS】Anniversary Cake

    [poj1020]Anniversary Cake Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 17203   Accep ...

  3. 北大ACM - POJ试题分类(转自EXP)

    北大ACM - POJ试题分类 -- By EXP 2017-12-03 转载请注明出处: by EXP http://exp-blog.com/2018/06/28/pid-38/ 相关推荐文: 旧 ...

  4. POJ 1020 Anniversary Cake(DFS)

    Anniversary Cake Time Limit: 1000MSMemory Limit: 10000KB64bit IO Format: %I64d & %I64u Submit St ...

  5. poj 1020 Anniversary Cake(切正方形蛋糕+搜索)

                                                                                                         ...

  6. 北大 ACM 分类 汇总

    1.搜索 //回溯 2.DP(动态规划) 3.贪心 北大ACM题分类2009-01-27 1 4.图论 //Dijkstra.最小生成树.网络流 5.数论 //解模线性方程 6.计算几何 //凸壳.同 ...

  7. Anniversary Cake

    Anniversary Cake Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 15704   Accepted: 5123 ...

  8. 【poj1020】 Anniversary Cake

    http://poj.org/problem?id=1020 (题目链接) 题意 有一个S*S的大蛋糕,还有许多正方形的小蛋糕,问能否将大蛋糕完整的分成所有的小蛋糕,不能有剩余. Solution 像 ...

  9. 北大ACM题库习题分类与简介(转载)

    在百度文库上找到的,不知是哪位大牛整理的,真的很不错! zz题 目分类 Posted by fishhead at 2007-01-13 12:44:58.0 -------------------- ...

随机推荐

  1. go-import下划线的作用

    原文:http://studygolang.com/articles/4356 ------------------------------------------------------------ ...

  2. 【DataStructure】Charming usage of Set in the java

    In an attempt to remove duplicate elements from list, I go to the lengths to take advantage of  meth ...

  3. 连通分量模板:tarjan: 求割点 &amp;&amp; 桥 &amp;&amp; 缩点 &amp;&amp; 强连通分量 &amp;&amp; 双连通分量 &amp;&amp; LCA(近期公共祖先)

    PS:摘自一不知名的来自大神. 1.割点:若删掉某点后.原连通图分裂为多个子图.则称该点为割点. 2.割点集合:在一个无向连通图中,假设有一个顶点集合,删除这个顶点集合,以及这个集合中全部顶点相关联的 ...

  4. 使用qemu

    1 获取qemu启动linux kernel的log qemu-system-x86_64 -nographic -kernel xxx -initrd xxx -append "conso ...

  5. CSP 201612-3 权限查询 【模拟+STL】

    201612-3 试题名称: 权限查询 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 授权 (authorization) 是各类业务系统不可缺少的组成部分,系统用户通过授权 ...

  6. YTU 2504: 蚂蚁感冒

    2504: 蚂蚁感冒 时间限制: 1 Sec  内存限制: 128 MB 提交: 273  解决: 118 题目描述 长100厘米的细长直杆子上有n只蚂蚁.它们的头有的朝左,有的朝右.每只蚂蚁都只能沿 ...

  7. openstack horizon 学习(2) navigation、dashboard、panels

    本章的主要内容是如何用horizon的navigation结构添加一个应用的面板. Horizon中提供了两种为应用添加panel的方法,一种是通过Pluggable Settings的方式,另一种是 ...

  8. loj 6034 线段游戏

    题目大意: 给出若干条线段,用 (x1,y2),(x2,y2) 表示其两端点坐标,现在要求支持两种操作: 0 x1 y1 x2 y2 表示加入一条新的线段 (x1,y2),(x2,y2) 1 x0 询 ...

  9. 提交图片base64格式问题

    提交图片base64格式给后台,一定把data:image/png;base64,去掉,不然提交后后台返回的图片URL打开是一个破坏的图片.使用split("base64,")[1 ...

  10. Windows Java环境变量配置

    安装步骤略过... 环境变量配置 新建环境变量: JAVA_HOME C:\Program Files\Java\jdk1.6 将路径替换为自己的安装路径.    新建环境变量: classpath ...