https://vjudge.net/problem/UVA-1602

题意:w*h网格里放n连块,问有多少种放法

翻转、旋转90°、平移之后相同的算一种

推荐题解:

http://blog.csdn.net/qq_29169749/article/details/51420013

解决本题的三个问题:

1、状态的有效表示

2、状态的搜索

3、状态的判重

1、状态表示:set套set

定义结构体类型Cell 表示每一个格子的坐标

set<Cell>polyomino 表示一个合法的连通块 坐标 集合

set<polyomino>sp[i]  表示所有的i连块集合

这样用set里带的count() 可以方便的判重

2、每一个n连块都可以有一个n-1连块增加一个而来

3、

平移:

将连通块标准化,即连通块里坐标最小的格子(minx,miny)映射到(0,0)上去,

然后连通块整体沿向量(minx,miny)方向平移

称之为标准化

标准化之后的连通块相同,则他们可以通过平移操作相同

旋转:

现将连通块标准化

然后每次旋转90°,即坐标由(x,y)变为(y,-x)

然后再标准化

翻转:

先将连通块标准化

然后沿x轴翻转,即坐标由(x,y)变为 (x,-y)

然后再标准化

翻转时只需沿x轴翻转

因为沿y轴翻转可以看做 先沿x轴翻转,再旋转2次90°

对于每一种翻转、旋转、翻转之后再旋转、旋转之后再翻转

均可以有旋转和翻转的组合完成

所以判重的时候,先判平移

然后 旋转4次90°

然后沿x轴翻转,再旋转4次90°

#include<set>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>using namespace std;int ans[11][11][11];struct  Cell
{int x,y;Cell(int x=0,int y=0):x(x),y(y) { }bool operator < (const Cell & rhs) const{if(x!=rhs.x) return x<rhs.x;return y<rhs.y; }
};
typedef set<Cell> polyomino;
set<polyomino> sp[11];const int dir_x[]={-1,1,0,0};
const int dir_y[]={0,0,-1,1};inline polyomino normalize(const polyomino &p)
{int minx=p.begin()->x,miny=p.begin()->y;for(polyomino :: const_iterator it=p.begin();it!=p.end();it++){minx=min(minx,it->x);miny=min(miny,it->y);}polyomino tmp;for(polyomino :: const_iterator it=p.begin();it!=p.end();it++){int x=it->x,y=it->y;tmp.insert(Cell(x-minx,y-miny));}return tmp;
}inline polyomino rotation(const polyomino &p)
{polyomino tmp;for(polyomino :: const_iterator it=p.begin();it!=p.end();it++){int x=it->x,y=it->y;tmp.insert(Cell(y,-x));}return normalize(tmp);
}inline polyomino flip_x(const polyomino &p)
{polyomino tmp;for(polyomino :: const_iterator it=p.begin();it!=p.end();it++){int x=it->x,y=it->y;tmp.insert(Cell(x,-y));}return normalize(tmp);} void set_poly(const polyomino & p,const Cell &c)
{polyomino tmp=p;tmp.insert(c);tmp=normalize(tmp);int n=tmp.size();for(int i=0;i<4;i++){if(sp[n].count(tmp)) return;tmp=rotation(tmp);} tmp=flip_x(tmp);for(int i=0;i<4;i++){if(sp[n].count(tmp)) return;tmp=rotation(tmp);}sp[n].insert(tmp);
}void make_Ans_List()
{polyomino cur;cur.insert(Cell(0,0));sp[1].insert(cur);for(int n=1;n<=10;n++)for(set<polyomino>::iterator it=sp[n-1].begin();it!=sp[n-1].end();it++)for(polyomino ::const_iterator cit=(*it).begin();cit!=(*it).end();cit++)for(int dir=0;dir<4;dir++){Cell newc(cit->x+dir_x[dir],cit->y+dir_y[dir]);if((it->count(newc))==0) set_poly(*it,newc);}for(int n=1;n<=10;n++)for(int w=1;w<=10;w++)for(int h=1;h<=10;h++){int cnt=0;for(set<polyomino>::iterator it=sp[n].begin();it!=sp[n].end();it++){int maxx=0,maxy=0;for(polyomino :: const_iterator c=(*it).begin();c!=(*it).end();c++){maxx=max(maxx,c->x);maxy=max(maxy,c->y);}if(min(maxx,maxy)<min(w,h) && max(maxx,maxy)<max(w,h)) cnt++;}ans[n][w][h]=cnt;}} int main()
{make_Ans_List();int n,w,h;while(scanf("%d%d%d",&n,&w,&h)!=EOF){if(n>w*h) printf("0\n");else printf("%d\n",ans[n][w][h]);}
}

转载于:https://www.cnblogs.com/TheRoadToTheGold/p/7668659.html

UVA 1602 Lattice Animals相关推荐

  1. UVa 1602:Lattice Animals(BFS)

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=841& ...

  2. UVA1602 Lattice Animals 网格动物

    题目:输入n,w,h(1n10,1w,hn),求能放在w*h网格里的不同的n连块的个数(注意:平移.旋转.翻转后相同的算作同一种). 分析:本题关键就是如何判重,有n个格子连通,所幸n很小,可以回溯求 ...

  3. UVA-1602 Lattice Animals 搜索问题(打表+set)

    题目链接 https://vjudge.net/problem/UVA-1602 紫书的一道例题,跟之前的很多题目有很多不同. 本题不像是一般的dfs或bfs这样的搜索套路,而是另一种枚举思路. 题意 ...

  4. 紫书《算法竞赛入门经典》

    紫书<算法竞赛入门经典>题目一览 第3章 数组和字符串(例题) UVA 272 TEX Quotes UVA 10082 WERTYU UVA 401 Palindromes UVA 34 ...

  5. 《题目与解读》红书 训练笔记目录《ACM国际大学生程序设计竞赛题目与解读》

    虽然2012年出版的老书了,但是是由三次世界冠军的上海交大ACM队出版的书籍,选择的题目是ACM经典中的经典,书中有非常详细的题解,可以学到很多东西,值得一刷. 目录 第一部分 第一章 数学 1.1 ...

  6. ACM题集以及各种总结大全(转)

    ACM题集以及各种总结大全! 虽然退役了,但是整理一下,供小弟小妹们以后切题方便一些,但由于近来考试太多,顾退役总结延迟一段时间再写!先写一下各种分类和题集,欢迎各位大牛路过指正. 一.ACM入门 关 ...

  7. POJ前面的题目算法思路【转】

    1000 A+B Problem 送分题 49% 2005-5-7 1001 Exponentiation 高精度 85% 2005-5-7 1002 487-3279 n/a 90% 2005-5- ...

  8. POJ 超详细分类

    POJ 各题算法 1000    A+B Problem            送分题     49%    2005-5-7 1001    Exponentiation         高精度   ...

  9. 搜索题,留着以后慢慢刷

    转过来,留着以后慢 慢 刷555.. 简单搜索 (1)深度优先搜索 (poj2488,poj3009,poj1321) (2)广度优先搜索 (poj3278,poj1426,poj3126,poj30 ...

最新文章

  1. Android测试中被测应用挂了怎么办?
  2. java list取值_Java集合详解
  3. 用C#生成随机中文汉字验证码
  4. 求一个数是几位数,并求每位数相加的和
  5. 「爬虫入门」拒绝跟热点搞python,直接在浏览器里体验『第一次』,理解原理=>如鱼得水
  6. 六石编程学:功能要定期测试
  7. 大一高数下册笔记整理_高等数学下册知识点总结.doc
  8. deepspeech 1 (百度 2014 论文解读)
  9. P2440 木材加工
  10. win10自带sftp服务器_如何使用OpenSSH在Win10中设置SFTP服务器
  11. 万字拆解伊利:84天从0到千万GMV,传统巨头在抖音电商的“快与慢”
  12. 3d渲染是显示计算机内存不足,win10系统使用3d渲染图片出现内存不足如何解决
  13. uni-app小程序,实现根据中文首字母排序功能
  14. gps android时钟同步,时间同步下载-时间同步(Clocksync) 安卓版v1.2.6-PC6安卓网
  15. 1241. 外卖店优先级 Java题解 (模拟)【第十届蓝桥杯省赛C++A/C组,JAVA A/B/C组】
  16. 1dB增益压缩点概述及测试
  17. h5页面在新版微信iOS 端出现底部白色导航条
  18. Linux下Mysql 5.7的安装及远程连接配置
  19. HR人力资源管理精粹70则
  20. Unet++语义分割网络(网络结构分析+代码分析)

热门文章

  1. java进阶 2018_Java Web基础入门2018版
  2. quartz 每月一次_Quartz Cron表达式 每周、每月执行一次
  3. python列表可以删除和修改吗_Python列表常见操作详解(获取,增加,删除,修改,排序等)...
  4. gin redis 链接不上_php + redis 高并发商品秒杀 完整业务模拟流程 实现方案
  5. 计算机网络自顶向下方法【七】——链路层
  6. NodeJs-- 新建项目实例
  7. Struts2与Servlet之间的关系
  8. C#的static constructor抛了异常会怎么处理?
  9. 很实用的jQuery事件 - toggle() 方法
  10. IIS支持Shtml后辍文件方法