例题 7-14 网格动物(Lattice Animals, ACM/ICPC NEERC 2004, UVa1602)

2024-04-13 03:08

本文主要是介绍例题 7-14 网格动物(Lattice Animals, ACM/ICPC NEERC 2004, UVa1602),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原题链接:https://vjudge.net/problem/UVA-1602
分类:数据结构,好题
备注:生成n连块,考验思维,打表

代码与其它博客一样,似乎起源都是lrj老师。
很神奇,也很好理解,翻转旋转很容易想到,平移依靠坐标的相对位置就感觉很奇妙。然后每次增块都是基于上一次的图形的。对set的应用也很巧妙。
因为从(0,0)开始增块,因此当前连块的长宽就取最大的x,y再加一即可。

#include<bits/stdc++.h>
using namespace std;struct Cell{int x,y;Cell(int _x=0,int _y=0):x(_x),y(_y){}bool operator < (const Cell &rhs) const{return x<rhs.x||(x==rhs.x&&y<rhs.y);}
};typedef set<Cell> Polyomino;inline Polyomino normalize(const Polyomino &p){Polyomino q;int minX=p.begin()->x, minY=p.begin()->y;for(Polyomino::iterator it=p.begin();it!=p.end();++it){minX=min(minX,it->x);minY=min(minY,it->y);}for(Polyomino::iterator it=p.begin();it!=p.end();++it){q.insert(Cell(it->x-minX,it->y-minY));}return q;
}inline Polyomino rotate(const Polyomino &p){//坐标轴逆时针旋转90度Polyomino q;for(Polyomino::iterator it=p.begin();it!=p.end();++it){q.insert(Cell(it->y,-it->x));}return normalize(q);
}inline Polyomino flip(const Polyomino &p){//以y轴为对称轴翻转Polyomino q;for(Polyomino::iterator it=p.begin();it!=p.end();++it){q.insert(Cell(-it->x,it->y));}return normalize(q);
}const int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
const int maxn=11;
set<Polyomino> Poly[maxn];
int ans[maxn][maxn][maxn];inline bool flipInFourDir(Polyomino &p, int n){for(int i=0;i<4;++i){if(Poly[n].count(p))return false;p=rotate(p);}return true;
}void checkPolyomino(const Polyomino &src, const Cell &newCell){Polyomino q=src;q.insert(newCell);q=normalize(q);int n=q.size();if(flipInFourDir(q,n)==false)return;q=flip(q);if(flipInFourDir(q,n)==false)return;Poly[n].insert(q);
}void init(){Polyomino p;p.insert(Cell(0,0));Poly[1].insert(p);for(int n=2;n<maxn;++n){for(set<Polyomino>::iterator it=Poly[n-1].begin();it!=Poly[n-1].end();++it){for(Polyomino::const_iterator it2=(*it).begin();it2!=(*it).end();++it2){for(int i=0;i<4;++i){Cell newCell(it2->x+dir[i][0],it2->y+dir[i][1]);if((*it).count(newCell)==0)checkPolyomino(*it,newCell);}}}}for(int n=1;n<maxn;++n){for(int w=1;w<maxn;++w){for(int h=1;h<maxn;++h){int cnt=0;//找到长和宽符合要求的for(set<Polyomino>::iterator it=Poly[n].begin();it!=Poly[n].end();++it){int maxX=0,maxY=0;for(Polyomino::iterator it2=it->begin();it2!=it->end();++it2){maxX=max(maxX,it2->x);maxY=max(maxY,it2->y);}if(max(w,h)>max(maxX,maxY)&&min(w,h)>min(maxX,maxY))++cnt;}ans[n][w][h]=cnt;}}}
}int main(void){//freopen("in.txt","r",stdin);init();int n,w,h;while (~scanf("%d %d %d",&n,&w,&h)){printf("%d\n",ans[n][w][h]);}return 0;
}

这篇关于例题 7-14 网格动物(Lattice Animals, ACM/ICPC NEERC 2004, UVa1602)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/898984

相关文章

【数据结构与算法 经典例题】使用队列实现栈(图文详解)

💓 博客主页:倔强的石头的CSDN主页               📝Gitee主页:倔强的石头的gitee主页    ⏩ 文章专栏:《数据结构与算法 经典例题》C语言                                   期待您的关注 ​​ 目录  一、问题描述 二、前置知识 三、解题思路 四、C语言实现代码 🍃队列实现代码:

Bootstrap 5 网格系统

Bootstrap 5 网格系统 Bootstrap 5 是目前最流行的前端框架之一,它提供了一套强大的网格系统,帮助开发者快速构建响应式布局。本文将详细介绍 Bootstrap 5 的网格系统,包括其工作原理、使用方法以及最佳实践。 什么是 Bootstrap 网格系统? Bootstrap 网格系统是一种基于 Flexbox 的布局方法,它允许开发者将页面内容分为多列,并且可以轻松地控制

【大数据 复习】第11,12,13,14章

Web应用与流数据 1.在Web应用、网络监控、传感监测等领域,兴起了一种新的数据密集型应用——静态数据,即数据以大量、快速、时变的流形式持续到达。( )    正确答案: 错误 错误在静态数据,这里应该叫非静态数据之类的,虽然没有这个名词。 2.流数据适合采用批量计算,因为流数据适合用传统的关系模型建模。( )    正确答案: 错误 传统的关系模型一般是用于静态数据的存储和分析,例如 S

C++初学者指南第一步---14.函数调用机制

C++初学者指南第一步—14.函数调用机制 文章目录 C++初学者指南第一步---14.函数调用机制1.记住:内存的结构2.函数调用是如何工作的3. 不要引用局部变量4. 常见编译器优化5. Inlining内联 1.记住:内存的结构 堆(自由存储) 用于动态存储期对象,例如 std::vector 的内容。空间大,可以用于大容量存储(大多数用于主内存)。可以根据需要分配

AI大模型企业应用实战(14)-langchain的Embedding

1 安装依赖 ! pip install --upgrade langchain! pip install --upgrade openai==0.27.8! pip install -U langchain-openai ! pip show openai! pip show langchain! pip show langchain-openai 2 Embed_document

GUI布局:边界布局、流式布局、网格布局、卡片布局

边界布局 package guiTest;//JFrame默认的是边界布局BorderLayoutimport java.awt.BorderLayout;import javax.swing.JButton;import javax.swing.JFrame;public class BorderLayoutDemo {public static void main(String[

【会议征稿,ACM出版】2024年图像处理、智能控制与计算机工程国际学术会议(IPICE 2024,8月9-11)

2024年图像处理、智能控制与计算机工程国际学术会议(IPICE 2024)将于2024年8月9-11日在中国福州举行。本届会议由阳光学院、福建省空间信息感知与智能处理重点实验室、空间数据挖掘与应用福建省高校工程研究中心联合主办。 会议主要围绕图像处理、智能控制与计算机工程等研究领域展开,旨在为从事计算机等相关研究的专家学者提供一个交流科研成果和前沿技术的平台,了解学术发展趋势,拓宽研究思路

家政预约小程序14权限配置

目录 1 创建用户2 创建角色3 启用登录4 实现退出总结 我们现在小程序端的功能基本开发好了,小程序开发好之后需要给运营人员提供管理后台,要分配账号、配置权限,我们本篇就介绍一下权限如何分配。 1 创建用户 在微搭中,用户分为内部用户和外部用户。内部用户是可以由超管进行创建,在创建的时候要占用内部用户的授权数,每分配一个用户就会消耗一张证书。 而外部用户目前没有限制,外部

第13关:存储过程1、第14关:存储过程2。(2021数据库期末一)

目录 首先需要学习和了解的知识 第13关:存储过程1 任务描述 答案  第14关:存储过程2 任务描述 答案 本篇博客的答案博主是学习别人得来的,敢于借鉴和学习哈哈!! 首先需要学习和了解的知识 了解什么是存储过程以及存储过程的基本语法。(作者博客专栏或者b站学习)了解在命令行中,执行创建存储过程的SQL时。需要通过关键字 delimiter 指定SQL语句的结束

source配置文件不生效 原创 2016年03月14日 18:43:55 3558 问题背景: 升级jdk 1.8之后,启动时报版本编译问题,查看$JAVA_HOME,$JRE_HOME

source配置文件不生效 原创  2016年03月14日 18:43:55 3558 问题背景:       升级jdk 1.8之后,启动时报版本编译问题,查看$JAVA_HOME,$JRE_HOME,没有问题。      初步推断是没有source,sourec .bashrc 之后查看$JAVA_HOME,$JRE_HOME变成1.8版本,但启动时还是报错,这就