【例题 7-14 UVA-1602】Lattice Animals
【链接】 我是链接,点我呀:)
【题意】
在这里输入题意
【题解】
借鉴网上的题解的。
思路是。
用"标准化"的思想。
确定基准点(0,0)
然后假设(0,0)是第一个连通块。
然后通过大小为1的连通块(0,0)得到所有大小为2的连通块。
然后得到所有大小为3的连通块。。
以此类推
这样可以避免回溯的过程。
直接递推就好。
然后判重。
就是
(标准化->旋转)[4]
以及
翻转-> (标准化->旋转)[4]
()[x]表示括号内的过程重复4次
看看每一种是不是都不存在。
不存在的话,就说明找到了一种新的n+1连通块。
标准化就是每个点的x减去minx,每个点的y减去miny;
旋转则是每个点由{x,y}->{y,-x} (记住就好)
对称则是{x,y]->{x,-y}
每次做完操作之后都要重新标准化。
用set记录所有点的坐标既可。
每次从set中取出点,往外尝试扩展。变成n+1连通块。
(不必有范围的限制)
一开始陷入误区了。
想着每次(n,m)都重新dfs一遍。
其实不必。
我们这样处理出所有的连通块之后。
只要判断一下每个联通块是不是在相应的区域里面就好了。
在的话就递增答案。
【代码】
/*
1.Shoud it use long long ?
2.Have you ever test several sample(at least therr) yourself?
3.Can you promise that the solution is right? At least,the main ideal
4.use the puts("") or putchar() or printf and such things?
5.init the used array or any value?
6.use error MAX_VALUE?
7.use scanf instead of cin/cout?
8.whatch out the detail input require
*/
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
const int N = 10;
const int dx[4] = {0,0,1,-1};
const int dy[4] = {1,-1,0,0};
int len,n,m;
set<set<pii> > dic[N+10];
set <pii> myset;
int ans[N+5][N+5][N+5];
set <pii> biaozhun(set<pii> now){
int dx = 1e8,dy = 1e8;
for (auto temp:now){
dx = min(dx,temp.first);
dy = min(dy,temp.second);
}
set <pii> temp;
for (auto temp1:now){
temp.insert({temp1.first-dx,temp1.second-dy});
}
return temp;
}
set <pii> Rotate(set<pii> now){
set<pii> temp1;temp1.clear();
for (auto temp2:now) temp1.insert({temp2.second,-temp2.first});
return temp1;
}
set <pii> Mirror(set<pii> now){
set<pii> temp1;temp1.clear();
for (auto temp2:now) temp1.insert({temp2.first,-temp2.second});
return temp1;
}
void in(int dep,set<pii> now){
set <pii> temp1 = now;
for (int i = 1;i <= 4;i++){
temp1 = biaozhun(temp1);
if (dic[dep].count(temp1)>0) return;
temp1 = Rotate(temp1);
}
temp1 = biaozhun(temp1);
temp1 = Mirror(temp1);
for (int i = 1;i <= 4;i++){
temp1 = biaozhun(temp1);
if (dic[dep].count(temp1)>0) return;
temp1 = Rotate(temp1);
}
temp1 = biaozhun(temp1);
dic[dep].insert(temp1);
}
int main(){
#ifdef LOCAL_DEFINE
freopen("rush_in.txt", "r", stdin);
#endif
ios::sync_with_stdio(0),cin.tie(0);
set<pii> temp1;temp1.clear();
temp1.insert({0,0});
dic[1].insert(temp1);
for (int i = 1;i <= N-1;i++){
for (auto temp:dic[i]){
//temp是大小为i的一个连通块
for (auto cell:temp){
for (int j = 0;j < 4;j++){
int tx = cell.first + dx[j],ty = cell.second + dy[j];
if (temp.count({tx,ty})==0){
auto temp2 = temp;
temp2.insert({tx,ty});//生成一个新的连通块
in(i+1,temp2);//看看temp2这个连通块有没有重复。
}
}
}
}
}
for (int k = 1;k <= 10;k++)
for (int n = 1;n <= 10;n++)
for (int m = 1;m <= 10;m++){
for (auto temp:dic[k]){
int maxx = -100,maxy = -100;
for (auto cell:temp){
maxx = max(maxx,cell.first);
maxy = max(maxy,cell.second);
}
if (min(maxx,maxy)<min(n,m) && max(maxx,maxy)<max(n,m)){
ans[k][n][m]++;
}
}
}
int k,n,m;
while (cin >>k>>n>>m){
cout << ans[k][n][m]<<endl;
}
return 0;
}
【例题 7-14 UVA-1602】Lattice Animals的更多相关文章
- UVA - 1602 Lattice Animals (暴力+同构判定)
题目链接 题意:求能放进w*h的网格中的不同的n连通块个数(通过平移/旋转/翻转后相同的算同一种),1<=n<=10,1<=w,h<=n. 刘汝佳的题真是一道比一道让人自闭.. ...
- UVA 1602 Lattice Animals
题目 输入n.w.h($1\leqslant n \leqslant 10, 1\leqslant w,h \leqslant n$),求能放在w*h网格里的不同的n连块的个数(注意,平移.旋转.翻转 ...
- UVa 1602 Lattice Animals (STL && 生成n连块 && 无方向形状判重)
题意 : 给定一个 w * h 的 矩阵,在矩阵中找不同n个连通块的个数(旋转,翻转,平移算作一种) 分析 : 这题的关键点有两个 ① 生成n连块并且存储起来(因为题目是多测试用例,如果每一次都重新生 ...
- 【DFS】【打表】Lattice Animals
[ZOJ2669]Lattice Animals Time Limit: 5 Seconds Memory Limit: 32768 KB Lattice animal is a set o ...
- UVA 11768 - Lattice Point or Not(数论)
UVA 11768 - Lattice Point or Not option=com_onlinejudge&Itemid=8&page=show_problem&categ ...
- 紫书 例题7-14 UVa 1602(搜索+STL+打表)
这道题想了很久不知道怎么设置状态,怎么拓展,怎么判重, 最后看了这哥们的博客 终于明白了. https://blog.csdn.net/u014800748/article/details/47400 ...
- UVA-1602 Lattice Animals 搜索问题(打表+set)
题目链接 https://vjudge.net/problem/UVA-1602 紫书的一道例题,跟之前的很多题目有很多不同. 本题不像是一般的dfs或bfs这样的搜索套路,而是另一种枚举思路. 题意 ...
- UVA 11768 Lattice Point or Not(扩展欧几里德)
将直线转化为ax + by = c的形式,然后扩展欧几里得求在[x1, x2]之间的解 对直线与坐标轴平行的特判 调试了好长时间,注意: 1 正负数转化为整型的处理 2 注意判断有无解 #includ ...
- 【POJ】2170 Lattice Animals
1. 题目描述给定$n \times m, n.m \in [1, 10]$的方格,求不同形状的$[1 \cdots 10]$联通块的个数?所谓不同形状,表示不能通过平移.旋转.镜像实现相同的形状.2 ...
随机推荐
- DECLARE CURSOR (Transact-SQL)
Defines the attributes of a Transact-SQL server cursor, such as its scrolling behavior and the query ...
- git如何从远程非master分支更新到本地对应分支
git如何从远程非master分支更新到本地对应分支 自己实例 正确步骤 如果本地有分支,那就删除本地分支 删除本地分支::git branch -d 2018_4_18_second 切换分支: g ...
- bind DNS搭建笔记
设置默认网关 偶尔会出现问题 route add default gw 192.168.0.1 .vim /etc/sysctl.conf 这里是重点 配置路由转发,路由开启等都要用到. # Cont ...
- Html+CSS基础之CSS样式
认识CSS样式 CSS全称为“层叠样式表 (Cascading Style Sheets)”,它主要是用于定义HTML内容在浏览器内的显示样式,如文字大小.颜色.字体加粗等. 如下列代码: p{ fo ...
- 异常Exception
try…catch…finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过,我亲自体验的“教训”告诉我,这个东西可不是想象中的那么简单.听话.不信?那你看 ...
- How Hystrix Works?--官方
https://github.com/Netflix/Hystrix/wiki/How-it-Works Contents Flow Chart Circuit Breaker Isolation T ...
- Bundles软件
Bundle 称为:软件集 或 打包捆绑软件(软件束) Bundle就是一组包含了文件集,软件包或许可程序产品的软件,它们组合在一起为了实现一个特定的功能 快速来列出系统bundle软件 sm ...
- Android 第三方分享中遇到的问题以及解决方案
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 第三方登录和分享过程中难免遇到各种纠结的问题,下面将我遇到的分享给大家. 先说第三方登录 1.首先要 ...
- UVa 10101 - Bangla Numbers
题目:将数字数转化成数字加单词的表示形式输出. 分析:数论.简单题.直接分成两部分除10000000的商和余数,分别输出就可以. 说明:注意输入为数字0的情况,还有long long类型防止溢出. # ...
- 基于SVM的数据分类预測——意大利葡萄酒种类识别
update:把程序源代码和数据集也附上http://download.csdn.net/detail/zjccoder/8832699 2015.6.24 --------------------- ...