以下面一个题目为例,[题目链接]: https://www.luogu.com.cn/problem/P4961

题目中涉及求出八联通图的个数,这里给出这步的代码:

  1. memset(vis, 0, sizeof(vis));
  2. int cnt = 0;
  3. for(int i = 0; i < n; i++)
  4. {
  5. for(int j = 0; j < m; j++)
  6. {
  7. if(!bomb[i][j] && !vis[i][j])
  8. {
  9. ++cnt;
  10. vis[i][j] = 1;
  11. dfs(i, j);
  12. }
  13. }
  14. }
  1. void dfs(int x, int y)
  2. {
  3. for(int i = 0; i < 8; i++)
  4. {
  5. int xx = x + dx[i];
  6. int yy = y + dy[i];
  7. if(xx >= 0 && xx < n && yy >= 0 && yy < m && !vis[xx][yy] && !bomb[xx][yy])
  8. {
  9. vis[xx][yy] = 1;
  10. dfs(xx, yy);
  11. }
  12. }
  13. }

上面介绍的是求八连通图的个数,类似,求四联通图的个数也是相似的做法,只需把dx,dy数组变一变即可。

注意:四连通图也是八联通图,也就是说一个格的也行。

下面给出关于那道题目的代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5. const int maxn = 2000;
  6. int n, m;
  7. int dx[] = {0, 0, -1, -1, -1, 1, 1, 1};
  8. int dy[] = {1, -1, 0, 1, -1, 0, 1, -1};
  9. int bomb[maxn][maxn], vis[maxn][maxn];
  10. void dfs(int x, int y)
  11. {
  12. for(int i = 0; i < 8; i++)
  13. {
  14. int xx = x + dx[i];
  15. int yy = y + dy[i];
  16. if(xx >= 0 && xx < n && yy >= 0 && yy < m && !vis[xx][yy] && !bomb[xx][yy])
  17. {
  18. vis[xx][yy] = 1;
  19. dfs(xx, yy);
  20. }
  21. }
  22. }
  23. int main()
  24. {
  25. freopen("input.txt", "r", stdin);
  26. freopen("output.txt", "w", stdout);
  27. scanf("%d %d", &n, &m);
  28. for(int i = 0; i < n; i++)
  29. {
  30. for(int j = 0; j < m; j++)
  31. {
  32. scanf("%d", &bomb[i][j]);
  33. if(bomb[i][j])
  34. bomb[i][j] = -1;
  35. }
  36. }
  37. for(int i = 0; i < n; i++)
  38. {
  39. for(int j = 0; j < m; j ++)
  40. {
  41. if(bomb[i][j] == -1)
  42. continue;
  43. for(int ans = 0; ans < 8; ans++)
  44. {
  45. int xx = dx[ans] + i;
  46. int yy = dy[ans] + j;
  47. if(xx >= 0 && xx < n && yy >= 0 && yy < m && bomb[xx][yy] == -1)
  48. ++bomb[i][j];
  49. }
  50. }
  51. }
  52. memset(vis, 0, sizeof(vis));
  53. int cnt = 0;
  54. for(int i = 0; i < n; i++)
  55. {
  56. for(int j = 0; j < m; j++)
  57. {
  58. if(!bomb[i][j] && !vis[i][j])
  59. {
  60. ++cnt;
  61. vis[i][j] = 1;
  62. dfs(i, j);
  63. }
  64. }
  65. }
  66. for(int i = 0; i < n; i++)
  67. {
  68. for(int j = 0; j < m; j++)
  69. {
  70. if(bomb[i][j] != 0 && bomb[i][j] != -1)
  71. {
  72. int flag = 0;
  73. for(int k = 0; k < 8; k++)
  74. {
  75. int xx = i + dx[k];
  76. int yy = j + dy[k];
  77. if(xx < 0 || xx >= n || yy < 0 || yy >= m)
  78. continue;
  79. if(xx >= 0 && xx < n && yy >= 0 && yy < m && bomb[xx][yy] == 0)
  80. {
  81. flag = 1;
  82. break;
  83. }
  84. }
  85. if(!flag)
  86. ++cnt;
  87. }
  88. }
  89. }
  90. printf("%d\n", cnt);
  91. }

利用DFS算出有多少个连通图的更多相关文章

  1. Day_10【常用API】扩展案例1_利用人出生日期到当前日期所经过的毫秒值计算出这个人活了多少天

    分析以下需求,并用代码实现: 1.从键盘录入一个日期字符串,格式为 xxxx-xx-xx,代表该人的出生日期 2.利用人出生日期到当前日期所经过的毫秒值计算出这个人活了多少天 package com. ...

  2. 数据结构:关键路径,利用DFS遍历每一条关键路径JAVA语言实现

    这是我们学校做的数据结构课设,要求分别输出关键路径,我查遍资料java版的只能找到关键路径,但是无法分别输出关键路径 c++有可以分别输出的,所以在明白思想后自己写了一个java版的 函数带有输入函数 ...

  3. 利用SHA-1算法和RSA秘钥进行签名验签(带注释)

    背景介绍 1.SHA 安全散列算法SHA (Secure Hash Algorithm)是美国国家标准和技术局发布的国家标准FIPS PUB 180-1,一般称为SHA-1.其对长度不超过264二进制 ...

  4. 一次 Oracle 算出运算溢出问题 排查解决 (并非除数为零!)

    前段时间 出现过这个问题,: 表中有一列为number类型 rec_recordlength (两个时间的间隔长度/秒) 部分数据 统计这个字段就会出现 "算出运算溢出" 错误,很 ...

  5. javascript基础程序(算出一个数的平方值、算出一个数的阶乘、输出!- !- !- !- !- -! -! -! -! -! 、函数三个数中的最大数)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 关于一道面试题【字符串 '1 + (5 - 2) * 3',怎么算出结果为10,'eval'除外】

    最近徘徊在找工作和继续留任的纠结之中,在朋友的怂恿下去参加了一次面试,最后一道题目是: 写一个函数,输入一个字符串的运算式,返回计算之后的结果.例如这样的: '1 + (5 - 2) * 3',计算出 ...

  7. [转]JAVA 根据经纬度算出附近的正方形的四个角的经纬度

    csv文件转化为geojson文件中,涉及到路测图的打点生成,打点是由一个个正方形组成,而正方形是由四个点组成的,这四个点根据经纬度和范围生成,具体的实现代码是从网上找来的: /** * * @par ...

  8. JavaScript如何根据当天算出前三天和后三天

    经杨秀徐批准 中央军委颁发意见建设新型司令机关news 杨秀徐会见到北京述职的香港特首梁振英news 海军372潜艇官兵先进事迹报告会举行 杨秀徐作指示news 中央农村工作会议在京召开 李克强作重要 ...

  9. 【BioCode】删除未算出PSSM与SS的蛋白质序列

    代码说明: 由于一些原因(氨基酸序列过长),没有算出PSSM与SS,按照整理出来的未算出特征的文件,删除原来的蛋白质序列: 需删除的氨基酸文件732.txt(共732条氨基酸): 删除前 氨基酸共25 ...

随机推荐

  1. 深度学习之tensorflow框架(中)

    会话 开启会话 tf.Session用于完整的程序中 tf.InteractiveSession用于交互式上下文中的tensorflow 查看张量的值 都必须在会话里面 c_new_value=new ...

  2. wampserver 配置的几个坑(雾

    1. 从安装版本说起 自从我进入大学之后,便继承了学长那里的wampserver2.5版本 直到有一天自己下载wamp的时候才注意到已经有 3.0.6版本了 (现在有更高的了 但是3.0.6够用了) ...

  3. 并发编程之CyclicBarrier

    栅栏类似于闭锁,它能阻塞一组线程直到某个事件的发生.栅栏与闭锁的关键区别在于,所有的线程必须同时到达栅栏位置,才能继续执行.闭锁用于等待事件,而栅栏用于等待其他线程. CyclicBarrier可以使 ...

  4. Spring错误:org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.Bi

    在使用SSM框架传递多个参数的时候发生如下错误: 原因是因为在传递多个参数的时候没有使用注解@Param,所以才包如下错误: 参考的技术文章:https://blog.csdn.net/sinat_2 ...

  5. Unity 鼠标旋转物体360展示

    PC端 using UnityEngine; using System.Collections; public class DragRound : MonoBehaviour { public Tra ...

  6. Selenium元素定位之页面检测技巧

    我们在进行web自动化测试的时候进行XPath或者CSS定位,需要检测页面元素定位是否正确,如果用脚本去检测,那么效率是极低的. 一般网上推选装额外的插件来实现页面元素定位检测 如:firebug. ...

  7. Tika结合Tesseract-OCR 实现光学汉字识别(简体、宋体的识别率百分之百)—附Java源码、测试数据和训练集下载地址

     OCR(Optical character recognition) —— 光学字符识别,是图像处理的一个重要分支,中文的识别具有一定挑战性,特别是手写体和草书的识别,是重要和热门的科学研究方向.可 ...

  8. List 重载添加-add,删除-remove方法,以及获取子集方法

    package seday12; import java.util.ArrayList;import java.util.List; /*** @author xingsir* List重载了一对ad ...

  9. python pip 安装常用库如何使用国内镜像源

    最近通过python安装一些常用库发现下载速度特别慢,而且还会出现无法安装等错误,尝试找了一些国内的镜像源,发现阿里云的速度很快,这里做个记录,并分享给大家. 国内镜像源 阿里云:http://mir ...

  10. Leet Code 9.回文数

    判断一个整数是否是回文数. 题解 普通解法:将整数转为字符串,然后对字符串做判断. ///简单粗暴,看看就行 class Solution { public boolean isPalindrome( ...