黑白图像(DFS)
输入一个n*n的黑白图像(1表示黑色,0表示白色),任务是统计其中八连块的个数。如果两个黑格子有公共边或者公共顶点,就说它们属于同一个八连块。如图6-11所示的图形有3个八连块。
图6-11 拥有3个八连块的黑白图形
【分析】
用递归求解:从每个黑格子出发,递归访问它所有的相邻黑格。
int mat[MAXN][MAXN], vis[MAXN][MAXN];
void dfs(int x, int y) {
if(!mat[x][y] || vis[x][y]) return; // 曾经访问过这个格子,或者当前格子是白色
vis[x][y] = 1; // 标记(x,y)已访问过
dfs(x-1,y-1); dfs(x-1,y); dfs(x-1,y+1);
dfs(x-1,y); dfs(x,y+1);
dfs(x+1,y-1); dfs(x+1,y); dfs(x+1,y+1); // 递归访问周围的八个格子
}
这里,黑格(x,y)的mat[x][y]为1,白格为0。为了避免同一个格子访问多次,用标志vis[x][y]记录格子(x,y)是否访问过。在输入之前,在迷宫的外面加上一圈虚拟的白格子,见下面的程序。
memset(mat, 0, sizeof(mat)); //所有格子都初始化为白色,包括周围一圈的虚拟格子
memset(vis, 0, sizeof(vis)); // 所有格子都没有访问过
scanf("%d", &n);
for(int i = 0; i < n; i++) {
scanf("%s", s);
for(int j = 0; j < n; j++)
mat[i+1][j+1] = s[j]-'0'; // 把图像往中间移动一点,空出一圈白格子
}
接下来,只需不断找黑格,然后调用dfs。从它出发寻找八连块:
int count = 0;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
if(!vis[i][j] && mat[i][j]) { count++; dfs(i,j); }
//找到没有访问过的黑格
printf("%d\n", count);
完整的程序如下:
#include <stdio.h>
#include <string.h>
const int MAXN = 1000;
int n; int mat[MAXN][MAXN], vis[MAXN][MAXN];
void dfs(int x, int y) { if(!mat[x][y] || vis[x][y]) return; //曾经访问过这个格子,或者当前
格子是白色
vis[x][y] = 1; // 标记(x,y)已访问过
dfs(x-1,y-1); dfs(x-1,y); dfs(x-1,y+1);
dfs(x-1,y); dfs(x,y+1);
dfs(x+1,y-1); dfs(x+1,y); dfs(x+1,y+1); // 递归访问周围的八个格子
} int main() {
char s[MAXN + 10];
memset(mat, 0, sizeof(mat)); // 所有格子都初始化为白色,包括周围
一圈的虚拟格子
memset(vis, 0, sizeof(vis)); // 所有格子都没有访问过
scanf("%d", &n);
for(int i = 0; i < n; i++) {
scanf("%s", s);
for(int j = 0; j < n; j++)
mat[i+1][j+1] = s[j]-'0'; // 把图像往中间移动一点,空出一圈白格子
}
int count = 0;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
// 找到没有访问过的黑格
if(!vis[i][j] && mat[i][j]) { count++; dfs(i,j); }
printf("%d\n", count);
return 0;
}
上面的函数dfs就是深度优先遍历(Depth-FirstSearch,DFS)的算法,DFS和BFS一样,都是从一个结点出发,按照某种特定的次序访问图中的其他特点。不同的是,BFS使用队列来存放待扩展结点,而DFS使用的是栈。
附:我自己理解后敲的代码:
#include <stdio.h>
#include <string.h>
#include<algorithm>
#include<iostream>
#define M 1020
using namespace std;
int n;
int i,j;
char map[M][M];
void dfs(int x,int y)
{ if(map[x][y]!='1'||x<0||y<0||x>=n||y>=n)
return; //曾经访问过这个格子,或者当前格子是白色
else
{
map[x][y] = '0'; // 标记(x,y)已访问过
dfs(x-1,y-1);
dfs(x-1,y+1);
dfs(x-1,y);
dfs(x,y+1);
dfs(x,y-1);
dfs(x+1,y-1);
dfs(x+1,y);
dfs(x+1,y+1); // 递归访问周围的八个格子
}
} int main()
{
memset(map, 0, sizeof(map)); // 所有格子都没有访问过
scanf("%d", &n);
for(i=0; i<n; i++)
for(j=0; j<n; j++)
cin>>map[i][j]; int count = 0;
for(i = 0; i <n; i++)
for(j = 0; j <n; j++)
{
// 找到没有访问过的黑格
if(map[i][j]=='1')
{
dfs(i,j);
count++;
}
}
printf("%d\n", count);
return 0;
}
/*
6
100100
001010
000000
110000
111000
010100
*/
黑白图像(DFS)的更多相关文章
- dfs入门-cogs1640[黑白图像]
题目链接:http://cogs.pro:8081/cogs/problem/problem.php?pid=vxSmxkeqa [题目描述] 输入一个n×n的黑白图像(1表示黑色,0表示白色),任务 ...
- 小白书 黑白图像【DFS/Flood Fill】
http://blog.csdn.net/u010470972/article/details/33415617 Description 输入一个n×n的黑白图像(1表示黑色,0表示白色),任务是统计 ...
- [ActionScript 3.0] AS3.0 将图像的Alpha通道转换为黑白图像(分离ARGB方式)
import flash.display.BitmapData; import flash.display.Bitmap; /** * 将图像的Alpha通道转换为黑白图像(分离ARGB方式) */ ...
- [ActionScript 3.0] AS3.0将图像的Alpha通道转换为黑白图像(复制通道方式)
import flash.display.BitmapData; /** * 将图像的Alpha通道转换为黑白图像 */ var p:Point = new Point(0,0); var bmpd: ...
- TZOJ 3533 黑白图像(广搜)
描述 输入一个n*n的黑白图像(1表示黑色,0表示白色),任务是统计其中八连块的个数.如果两个黑格子有公共边或者公共顶点,就说它们属于同一个八连块.如图所示的图形有3个八连块. 输入 第1行输入一个正 ...
- MATLAB读取黑白图像显示却是黑色,24位深转8位深黑白图像解决方法
1.24位深转8位深: ps将24位深原图.png保存为GIF图256即为8位,再将8位gif图转为需要的.png,即转为8位深png图. 2.MATLAB读取黑白图像显示几乎全为黑色: 这是最近处理 ...
- uoj #139. 【UER #4】被删除的黑白树 dfs序 贪心
#139. [UER #4]被删除的黑白树 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/139 Descript ...
- uva806 Spatial Structures 空间结构 (黑白图像的四分树表示)
input 8 00000000 00000000 00001111 00001111 00011111 00111111 00111100 00111000 -8 9 14 17 22 23 44 ...
- Visio中如何绘制黑白图像
随机推荐
- Thread.sleep(0)的意义
我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时间.那么你有没有正确的理解这个函数的用法呢?思考下面这两个问题: 假设现在是 2008-4-7 12:00:00.000,如果我调用 ...
- 手工构建ISO的基本步骤
1.完成rpm包的构建 登录测试机,ssh 10.xx.xx.xxx cd /home/svn/desktop/trunk/ svn update ...
- [r]Seven habits of effective text editing
Seven habits of effective text editing(via) Bram Moolenaar November 2000 If you spend a lot of time ...
- 关于asp.net core部署到iis中出现 HTTP Error 502.5 - Process Failure的问题
环境是windows Server2008R2 出现这个问题搞了一下午都没解决,最后又加班才算搞定,由于英文不太好,官方的文档看了好几遍,也按照文档做的,但还是出现这个问题,百度google搜了很多解 ...
- 关于wtl的一个实验
代码如下: #include <iostream> using namespace std; template<typename T> class Base { public: ...
- RichEdit中插入带背景色文本的一种思路
uses RichEdit; function TextToRtf( // 将文本处理为RTF格式 mText: WideString // 输入文本 ): WideString; // 返回处理后的 ...
- VBA读取word中的内容到Excel中
原文:VBA读取word中的内容到Excel中 Public Sub Duqu() Dim myFile As String Dim docApp As Word.Applicati ...
- Struts2 权限验证
之前的Struts2项目通过再Sitemesh的母版页中使用Struts的if标签进行了session判断,使得未登录的用户不能看到页面,但是这 种现仅仅在view层进行,如果未登录用户直接在地址栏输 ...
- mysql 安装补充
1:假如下载的文件名为:mysql-5.0.45.tar.gz 2:假如copy到 /usr/local下 3:groupadd mysql #添加mysql组 4:useradd -g mysql ...
- javascript 基础学习整理 二 之 html对象总结,参考W3C
Anchor 对象 更改一个链接的文本.URL 以及 target 使用 focus() 和 blur() 向超链接添加快捷键 Document 对象 使用 document.write() 向输出流 ...