【例题 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 ...
随机推荐
- 面试基础_03实现strcpy、strcat、strcmp、strlen
实现代码例如以下: /************************************************************************* > File Name: ...
- ES6学习笔记(七)对象的新增方法
1.Object.is() ES5 比较两个值是否相等,只有两个运算符:相等运算符(==)和严格相等运算符(===).它们都有缺点,前者会自动转换数据类型,后者的NaN不等于自身,以及+0等于-0.J ...
- 昼猫笔记 从此告别复杂代码--JavaScript
昼猫笔记--给你带来不一样的笔记 不止是笔记 更多的是思考 大家好,我是一只来自喵星的前端初学者,由于我们喵星人科技较为落后,昼猫从今天开始带着使命来到地球学习前端知识. 从今天开始,猫猫我就从Jav ...
- 今日SGU 5.20
SGU 404 题意:.. 收获:取模 #include<bits/stdc++.h> #define de(x) cout<<#x<<"="& ...
- PHP如何去掉多维数组的重复值
1.定义函数 function array_unique_new($arr){ $t = array_map('serialize', $arr);//利用serialize()方法将数组转换为以字符 ...
- cz.msebera.android.httpclient.conn.ConnectTimeoutException: Connect to /192.168.23.1:8080 timed out(Android访问后台一直说链接超时)
明明之前还是可以运行的练习,过段时间却运行不了,一直说访问后台超时, 对于这个问题我整整弄了两天加一个晚上,心酸...,上网找了很多但是都解决不了,我就差没有砸电脑了. 首先 : 第一步:Androi ...
- SFINAE 模板替换失败而非报错的应用
体会这一个例子,检查是否是一个类:P187
- RvmTranslator6.3 is released
RvmTranslator6.3 is released eryar@163.com RvmTranslator can translate the RVM file exported by AVEV ...
- 关于命令行签名时.SF和.RSA文件的命名问题
准备工作: 签名文件名称为android.keystore 签名的别名为123456789.keystore 1.使用签名命令后例如以下图 发现.SF和.RSA文件自己主动命名为12345678.SF ...
- 给Linux添加新用户,新建用户,新建帐号
给Linux添加新用户,新建用户,新建帐号 添加用户组 sudo groupadd groupname 添加用户 sudo useradd username -m -s /sbin/nologin - ...