【例题 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 ...
随机推荐
- Java中AtomicInteger的使用!!!
今天在看Volley的源码的时候,看到里面使用了AtomicInteger这个类,曾经没用过,今天看了一下API学习了一下: 首先介绍一下这个类的用处,这个类主要是用来替换java中的自增和自减操作, ...
- 在Maven项目中关于SSM框架中邮箱验证登陆
1.你如果要在maven项目中进行邮箱邮箱验证,你首先要先到pom.xml文件中配置mail.jar,activation.jar包 <dependency> <groupId> ...
- JAVA并发--volatile
学过计算机组成原理的一定知道,为了解决内存速度跟不上CPU速度这个问题,在CPU的设计中加入了缓存机制,缓存的速度介于CPU和主存之间.在进行运算的时候,CPU将需要的数据映射一份在缓存中,然后直接操 ...
- 30.angularJS第一个实例
转自:https://www.cnblogs.com/best/tag/Angular/ AngularJS 通过 ng-directives 扩展了 HTML. ng-app 指令定义一个 Angu ...
- 4.graph.h
#pragma once #include <stdio.h> #include <graphics.h> #include <mmsystem.h> #pragm ...
- SGU 323 Aviamachinations
Aviamachinations Time Limit: 4500ms Memory Limit: 65536KB This problem will be judged on SGU. Origin ...
- 使用IntelliJ IDEA开发前的基本设置,有助于提高开发效率
2.界面字体大小设置 File菜单->Settings->Appearance->Override default fonts by(not recommended): Name:宋 ...
- JS 中 this 与闭包的结合产生的问题
代码片段一: var name = "The Window"; var object = { name : "My Object", getNameFunc : ...
- COGS——T 7. 通信线路
http://www.cogs.pro/cogs/problem/problem.php?pid=7 ★★ 输入文件:mcst.in 输出文件:mcst.out 简单对比时间限制:1.5 ...
- Android中关于Volley的使用(十)对Request和Reponse的认识
我们知道,在网络Http通信中.一定会有一个Request.相同的,也一定会有一个Response.而我们在Volley中利用RequestQueue来加入请求之前,一定会先创建一个Request对象 ...