前言

最近打算考研去软院,顺便向xmd了解了一点算法岗实习的行情,决定重拾算法能力,多多刷题。

现在在刷洛谷的题单和vijos的训练计划,听很多同学说leetcode很不错,打算把vj的训练计划刷完后看看,然后再去做做Atcoder和CF。


题目描述

题目链接:洛谷P1524.

大意是:有一个n×mn\times mn×m个网格的图,每个网格里的值表示这个网格的状态:

  • \ :左上角顶点到右下角顶点有一段线。
  • / :右上角顶点到左下角顶点有一段线。
  • X:左上到右下有一段线,右上到左下也有一段线。
  • . :没有线。

其中,每段线只能从单位网格的一个顶点覆盖到其对角线,而一针中连续的两段线必须处在不同的面。

现在给出这个网格正面背面两面的状态,问最少几针才能绣出来。


题目分析

我们考虑一个点xxx:

它若存在一段正面的线和一段背面的线,那么我们就可以把这两条线同时删去。最后剩下的线,每条都一定是以xxx为起点(或终点)的111针。

设点xxx最后剩下的线为dep(x)dep(x)dep(x),那么我们只需要找出与xxx相连的(不论是正面还是背面)所有点的dep(v)dep(v)dep(v)之和,最后将这个和除以222就是这个联通块所需要的针数了。然后遍历整张图,把所有的连通块都计算一遍即可。

特判一种情况:若一个连通块的∑dep(v)=0\sum dep(v)=0∑dep(v)=0,其实这个连通块也需要111针。(例如一个单位网格的对角线两点,在正面和背面同时有一段线)


示例代码

#include<bits/stdc++.h>
using namespace std;const int maxn = 45000;int n, m, Ans;
int d[maxn][2], vis[maxn];
int cnt, bg[maxn], nxt[maxn<<3], to[maxn<<3]; //数组大小一定要开够int bh(int x, int y){ //离散化 x行y列的点对应的编号return (x-1)*m + y;
}void add(int x, int y, int z){ //建图to[++cnt] = y;nxt[cnt] = bg[x];bg[x] = cnt;++ d[x][z];to[++cnt] = x;nxt[cnt] = bg[y];bg[y] = cnt;++ d[y][z];
}int dfs(int x){ //找联通块,并计算联通块的贡献vis[x] = 1;int back = abs(d[x][0] - d[x][1]);for(int e=bg[x]; e; e=nxt[e]){int t = to[e];if(!vis[t])back += dfs(t);}return back;
}int main(){char c, s[205], laji[10];scanf("%d%d", &n, &m);       gets(laji); //处理行末回车++ n; ++ m; // 一共(n+1)*(m+1)个点for(int k=0; k<2; ++k)for(int i=1; i<n; ++i){gets(s);int l = strlen(s);for(int j=1; j<m; ++j){c = s[j-1];int bh1, bh2, bh3, bh4;if(c == '\\'){bh1=bh(i,j), bh2=bh(i+1,j+1);add(bh1, bh2, k);}else if(c == '/'){bh1=bh(i,j+1), bh2=bh(i+1,j);add(bh1, bh2, k);}else if(c == 'X'){bh1=bh(i,j+1), bh2=bh(i+1,j), bh3=bh(i,j), bh4=bh(i+1,j+1);add(bh1, bh2, k);    add(bh3, bh4, k);}}}for(int i=1; i<=n; ++i)for(int j=1; j<=m; ++j){int bhx = bh(i,j);if(!vis[bhx] && bg[bhx]){ //遍历整张图,找所有联通块int s = dfs(bhx);if(!s) Ans += 1; //特判else    Ans += s/2;}}printf("%d", Ans);return 0;
}

前向星的nxt、tonxt、tonxt、to数组一定要算清楚大小啊啊啊啊啊啊!一开始开成maxn×4\times 4×4一直RE,后来意识到背面也有边才发现要maxn×8\times 8×8.


后记

一开始想的是把一个顶点的正面和背面看成两个点,正面的一段线就给正面的两点连权值为111的边,背面的就给背面的两点连权值为111的边。如果一个顶点在正面和背面都有边,那就给正面和背面的这两点连一条权值为000的边。

这个做法和正解思路基本一样,但是当时没想清楚问题的本质,一时没做出来。看来以后要先从问题最基础的情况思考起,这样更容易找到问题的本质。

洛谷P1524 十字绣 dfs+思维相关推荐

  1. 洛谷 P1524 十字绣

    P1524 十字绣 题目背景 考古学家发现了一块布,布上做有针线活,叫做"十字绣",即交替地在布的两面穿线. 题目描述 布是一个n*m的网格,线只能在网格的顶点处才能从布的一面穿到 ...

  2. 洛谷 P1784 数独 dfs

    题目描述 数独是根据 9×9 盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个粗线宫内的数字均含 1 - 9 ,不重复.每一道合格的数独谜题都有且仅有唯一答案,推理方法也以此为 ...

  3. 洛谷:P1524 十字绣(图论中 (出 / 入) 度的应用)

    洛谷:十字绣 我们把格子上的点抽象成图中的节点,同时开一个数组记录它的度(无向图) 我们再把点的贡献定义为:图中一个点通过相连的边得到的度数,也就相当于它贡献出的针数 如果该点与正面的某一条线相连,我 ...

  4. 洛谷 P1019 单词接龙 (DFS)

    题目传送门 当时一看到这题,蒟蒻的我还以为是DP,结果发现标签是搜索-- 这道题的难点在于思路和预处理,真正的搜索实现起来并不难.我们可以用一个贪心的思路,开一个dic数组记录每个单词的最小重复部分, ...

  5. *【洛谷 - P1025】数的划分(dfs 或 dp 或 母函数,第二类斯特林数Stirling)

    题干: 题目描述 将整数n分成k份,且每份不能为空,任意两个方案不相同(不考虑顺序). 例如:n=7,k=3,下面三种分法被认为是相同的. 1,1,5 1,5,1 5,1,1 问有多少种不同的分法. ...

  6. 洛谷八连测——关于取模与思维僵化

    有一天小妖精们又在做游戏.这个游戏是这样的. 妖精仓库的储物点可以看做在一个数轴上.每一个储物点会有一些东西,同时他们之间存在距离. 每次他们会选出一个小妖精,然后剩下的人找到区间[l,r][l,r] ...

  7. DFS(剪枝与优化) - 洛谷 P1361 - 小猫爬山

    DFS(剪枝与优化) - 洛谷 P1361 - 小猫爬山 翰翰和达达饲养了N只小猫,这天,小猫们要去爬山. 经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_&l ...

  8. 洛谷 P1238 走迷宫【搜索】【DFS】

    洛谷 P1238 走迷宫 一.题目链接 二.题目分析 (一)算法标签 (二)解题思路 三.AC代码 四.其它题解 一.题目链接 洛谷 P1238 走迷宫 二.题目分析 (一)算法标签 搜索 DFS ( ...

  9. dfs 洛谷 P1605 迷宫

    洛谷 P1605 迷宫 题目: 链接 https://www.luogu.com.cn/problem/P1605 思路:从出发点点出发dfs搜索每一次可以到达终点的路径,边界条件为不能走障碍物(在输 ...

最新文章

  1. 机器学习数据预处理之缺失值:预测填充(回归模型填充、分类模型填充)
  2. 港大正式启动全球招聘学术人才,计划延揽百位世界级杰出学者
  3. 回顾inputstream和outputstream
  4. SharePoint技术峰会2009视频(6)
  5. 避免重复造轮子,我们去哪找FPGA IP或是HDL功能模块?
  6. 非UI线程下页面处理:view的postInvalidate和post对消息处理的差异化
  7. pythond的执行原理_D*路径规划算法及python实现
  8. Linux两块磁盘挂载指向一个文件夹LVM磁盘管理(一)
  9. 里加一列为1_9月1号新宠物食品法规实施啦,辣鸡宠物食品遭殃,你也可能违法...
  10. 安装zabbix及LNMP的平台的搭建
  11. 单链表的初始化,整表创建,单个元素插入,单个元素删除,整表删除等操作...
  12. 数据分析专题报告范文6篇_小学生看图写话范文:小熊玩跷跷板?(6篇),让孩子参考练习...
  13. python日志,支持彩色打印和文件大小切片写入和写入mongodb
  14. 在ChemDraw中一键隐藏所有氢原子的方法
  15. C 标准库 —— ctypes.h
  16. ubuntu服务器系统日志在哪里,如何在Ubuntu上查看和写入系统日志文件
  17. 使用boost线程池很好的例子
  18. VS2017使用C#编写COM组件
  19. Web前端业界氛围极好的群——鬼懿IT
  20. 基于jdk8 LocalDate系列API的全新实用时间工具类

热门文章

  1. mcbbs弑雪酱发布一览
  2. spring cloud微服务分布式云架构 - common-service 项目构建过程
  3. 戒除手机滥用经验贴(第一周)
  4. 汇编语言push总结
  5. C++类和对象(三)
  6. 惠普企业旗下软件业务与Mirco Focus合并
  7. 《Rigging the Lottery》 RigL算法 论文阅读笔记
  8. 腾讯工程师一年挣多少钱?土豪大厂太任性了
  9. 四十八.面向对象程序设计——Java语言第一周编程题:分数
  10. Share Creators萌芽人才培养计划来了!