P1790 矩形分割(隐含的电风扇)
描述:https://www.luogu.com.cn/problem/P1790
有一个长为a,宽为b的矩形(1≤a≤6,2≤b≤6)。可以把这个矩形看作是a*b个小方格。
我们现在接到了这样的一个任务:请你计算出,把这个矩形分割成两个部分的方法总数。
你不是可以任意地分割这个大的矩形, 必须满足:
分割后,每个部分,至少各自均有一个方格是在大矩形的最外边上(即大矩形最外面一环的方格)。

摘自 ywwuyi
- 这道题的思路实际非常简单
- 一个由ab个小矩形组成的矩形
- 事实上可以看成一个由(a+1)(b+1)个点组成的点图
- 那么题目就可以转换为从一个边缘上的点出发,到另一个边缘点,一共有几个方案
- 为了避免重复方案的出现,我们将出发点设置在最左及最上的边上(或者最右和最下的边)
- 接下来考虑无效切割的处理(如切割(1,1)与(2,1)之间的边,这样图依然只有一个),显然,如果我们直接从边缘点开始搜索,无效切割的出现是必然的,所以我们需要做一些处理
- 首先,不将矩形的四个顶点(即边与边的交点)作为出发点,因为从顶点出发必然会导致无效切割
- 其次,我们手动将出发点走到点阵内(如从(1,1)到(1,2)),然后再进行搜索,就可以避免无效切割。这时可能会有人问,如果"手动走到的那个点"也是边缘点怎么办?我们只需要把关于边缘点的判断写在dfs开头即可。
- 最后,跳出搜索的条件就是当前位置再次到达边缘点,答案+1,回溯
- 值得注意的是,n是长m是宽,在这题当中长是竖着摆的,所以x应该是与n配对
#include <bits/stdc++.h>
using namespace std;
int n,m,vis[][],ans;
int b[]={,,,-},c[]={,-,,};
void dfs(int x,int y)
{
if(x==||y==||x==n||y==m){
ans++;
return;
}
for(int i=;i<;i++)
{
int nx=x+b[i],ny=y+c[i];
if(nx<||ny<||nx>n||ny>m) continue;
if(vis[nx][ny]) continue;
vis[nx][ny]=;
dfs(nx,ny);
vis[nx][ny]=;
}
}
int main()
{
cin>>m>>n;//转换为点图时n+1,m+1
n++;m++;//长和宽
for(int i=;i<n;i++)//那么处理1和n+1,都枚举一次
{
memset(vis,,sizeof(vis));
vis[i][]=vis[i][]=;
dfs(i,);
}
for(int i=;i<m;i++)
{
memset(vis,,sizeof(vis));
vis[][i]=vis[][i]=;
dfs(,i);
}
cout<<ans;
}
P1790 矩形分割(隐含的电风扇)的更多相关文章
- hihocoder [Offer收割]编程练习赛12 [1495] ---- 矩形分割
原题链接 矩形分割 算法分析: 解决该题要用到"并查集"的思想. 这里有一篇不错的博客介绍并查集: 并查集(Union-Find)算法介绍 记 int total=N*M,这里会有 ...
- 洛谷 P1324 矩形分割
P1324 矩形分割 题目描述 出于某些方面的需求,我们要把一块N×M的木板切成一个个1×1的小方块. 对于一块木板,我们只能从某条横线或者某条竖线(要在方格线上),而且这木板是不均匀的,从不同的线切 ...
- TYVJ 1094 矩形分割
时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 YHOI Train#4 Problem 1 描述 出于某些方面的需求,我们要把一块N×M的木板切成一个个1× ...
- TYVJ P1094 矩形分割 标签:DP
做题记录:2016-08-12 21:42:21 背景 YHOI Train#4 Problem 1 描述 出于某些方面的需求,我们要把一块N×M的木板切成一个个1×1的小方块.对于一块木板,我们只能 ...
- P3173 [HAOI2009]巧克力 && P1324 矩形分割
题目描述 出于某些方面的需求,我们要把一块N×M的木板切成一个个1×1的小方块. 对于一块木板,我们只能从某条横线或者某条竖线(要在方格线上),而且这木板是不均匀的,从不同的线切割下去要花不同的代价. ...
- hihocoder offer收割编程练习赛12 C 矩形分割
思路: 模拟,深搜. 实现: #include <iostream> #include <cstdio> #include <string> using names ...
- 【[Offer收割]编程练习赛12 C】矩形分割
[题目链接]:http://hihocoder.com/problemset/problem/1495 [题意] [题解] 把每个方块都再分成3*3的小块; 这样; 对于一个方块来说 如果是'\' 则 ...
- poj1191 棋盘分割【区间DP】【记忆化搜索】
棋盘分割 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16263 Accepted: 5812 Description ...
- [HAOI2007]分割矩阵 DP+推式子
发现最近好少写博客啊(其实是各种摆去了) 更一点吧 这道题要求最小化均方差,其实凭直觉来说就是要使每个块分的比较均匀一点,但是单单想到想到这些还是不够的, 首先f[i][j][k][l][t]表示以( ...
随机推荐
- go 中的WaitGroup
wait_group sync.WaitGroup 类型是并发安全的,也是开箱就能用的. 该类型有三个指针方法,即:Add,Done和Wait. sync.WaitGroup是一个结构体类型.其中一个 ...
- loadrunner post请求
注意:loadrunner参数中的引号,需要自己加"\" post 请求,分为header 和body两个部分处理 header部分比较容易处理,使用函数实现,如web_add_h ...
- Fiddler 内置命令与断点
Fiddler还有一个藏的很深的命令框,就是眼前,我用了几年的Fiddler都没有发现它,偶尔在别人的文章发现还有这个小功能,还蛮好用的,整理下记录在这里. FIddler断点功能就是将请求截获下来, ...
- 一、uart&tty驱动
一.I.MX6 UART驱动 文件路径:\linux_IMX6_CoreC_3..35_for_Linux\drivers\tty\serial\imx.c .驱动入口函数:imx_serial_in ...
- Golang Web入门(2):如何实现一个高性能的路由
摘要 在上一篇文章中,我们聊了聊在Golang中怎么实现一个Http服务器.但是在最后我们可以发现,固然DefaultServeMux可以做路由分发的功能,但是他的功能同样是不完善的. 由Defaul ...
- stand up meeting 12/29/2015
part 组员 今日工作 工作耗时/h 明日计划 工作耗时/h UI 冯晓云 重写popup UI添加笔记功能 6 mergeUI ...
- G - Can you find it? 二分
Give you three sequences of numbers A, B, C, then we give you a number X. Now you need to calculate ...
- python_ck01(虚拟环境管理)
拖拖拉拉的毛病还是依旧如初... 断断续续坚持三天总算把虚拟环境管理部分的内容给看完了. 对三天的知识点进行梳理,方便以后回顾. ①虚拟环境安装 用pip install + 包名的方式安装,涉及到的 ...
- winfrom 基础
1 winfrom就是一种窗体开发端应用程序 2 窗体分类 1)记事本类:可以最大最小化,可以拖拽 窗体默 ...
- java 方法的重载、重写与重构
首先我们要知道重载.重写.重构的区别 重载:指的是在同一个类中,方法名相同,但是参数数量.参数类型或者返回类型不同的方法就叫做重载. 重写: 重写分两种.第一种的是在子类继承父类的情况下,通过@Ove ...