黑白图像问题

1.题目描述:

                                                                      黑白图像

Time Limit(Common/Java):1000MS/3000MS          Memory Limit:65536KByte
Total Submit:282            Accepted:82

Description

输入一个n×n的黑白图像(1表示黑色,0表示白色),任务是统计其中八连块的个数。如果两个黑格子有公共边或者公共顶点,就说它们属于同一个八连块。如下图所示的图形有3个八连块。

Input

第1行输入一个正整数n(n≤700),此后输入n行,每行是由n个0或1组成的字符串。

Output

在输入黑白图像中,八连块的个数

Sample Input

6
100100
001010
000000
110000
111000
010100

Sample Output

3

Source

刘汝佳《算法竞赛入门经典》

2.思路分析:

首先我们可以看见这个问题属于有关图的递归问题,对于每一个黑格我们都有类似的操作:

1.首先看这个含1的数据是否被访问过,判断是否被访问过可以考虑用一个等大的二维数组对每一个数据进行鉴别;

2.该数据周围的八个数据是否为1.如果是将其鉴别变量变为1,后面不再考虑。

3:代码展示:

 1 #include<stdio.h>
 2 #include<memory.h>
 3 const int MAXN=1000;
 4 void dfs(int i,int j);
 5 int vis[MAXN][MAXN],mat[MAXN][MAXN];
 6 char S[MAXN];
 7 int main()
 8 {
 9     int n;
10     //dfs[1][1];
11     while(scanf("%d",&n)!=EOF)
12     {
13         int  count =0,num=1;
14         memset(vis,0,sizeof(vis));
15         memset(mat,0,sizeof(mat));
16         for(int i=1;i<=n;i++)//首先输入数据,并注意边缘问题
17         {
18             scanf("%s",S);
19             for(int j=0;j<n;j++)
20             mat[i][j+1]=S[j]-‘0‘;
21             memset(S,‘\0‘,sizeof(S));
22         }
23         for(int i=1;i<=n;i++)
24         for(int j=1;j<=n;j++)
25         {
26             if(mat[i][j]&&(!vis[i][j]))
27             {
28                 count++;
29             dfs(i,j);
30             }
31         }
32         printf("%d\n",count);
33     }
34     return 0;
35 }
36 void dfs(int i,int j)
37 {
38     if(!mat[i][j]||vis[i][j]) return ;
39     vis[i][j]=1;
40     dfs(i-1,j-1); dfs(i-1,j);dfs(i-1,j+1);
41     dfs(i,j-1);               dfs(i,j+1);
42     dfs(i+1,j-1);dfs(i+1,j);dfs(i+1,j+1);
43
44 }

总结:

1.BFS与DFS问题都需要注意边界问题,不能超出数据所规定的范围。本题是考虑在边界上加一圈隐形白格。

2.递归调用会把局部变量(i,j,i-1,j-1·····)压入帧栈中,如果图像太大,则有溢出危险。

黑白图像问题

时间: 2024-11-05 21:54:19

黑白图像问题的相关文章

ACM:图的DFS,黑白图像

题目:输入一个n*n的黑白图像(1表示黑色,0表示白色),任务是统计其中八连块的个数.如果两个黑格子有公共边或者公共顶点,就说它们属于同一个八连块. 输入:第一行输入一个整数n(n<=500),下面输入n行,每行是由n个0或1组成的字符串. 输出:输出有多少个八连块,以及每个块的面积.一个方格的面积为1. 分析:把图片最外层扩展开来,在最外面加一层白色的框框..设置一个数组来存储每个八连块的面积..DFS递归调用每一个黑色的方块..DFS的最后一个参数要设置为传递引用.. #include <

深度搜索应用之黑白图像(非递归)

深度搜索应用之黑白图像(非递归) 前言: 使用深度搜索,有两个方法:递归,栈.本质是栈. 递归有一个缺陷,栈溢出.栈有一个缺陷,程序相对递归更复杂. 练习题: 输入一个n*n的黑白图像(1表示黑色,0表示白色),任务是统计其中八连块的个数.如果两个黑格子有公共边或者公共顶点,就说它们属于同一个八连块.(题意是让求连在一起的块有几个,图见书本)   使用递归求解:点这里 使用栈求解: 1 #include <iostream> 2 #include <memory.h> 3 #inc

MATLAB读取黑白图像显示却是黑色,24位深转8位深黑白图像解决方法

1.24位深转8位深: ps将24位深原图.png保存为GIF图256即为8位,再将8位gif图转为需要的.png,即转为8位深png图. 2.MATLAB读取黑白图像显示几乎全为黑色: 这是最近处理图像库遇见的一个问题,估计是MATLAB的一个bug,用MATLAB暂时没想到解决方法,所以转战有python解决. 问题具体如下: 这是8位深的png图,看上去是黑白色都有,但用MATLAB处理读取后并显示却是:大部分数字为0,边缘部分极少数大于0. 很是诡异有么有,究竟是眼睛欺骗了我们,还是数字

黑白图像

#include <stdio.h> #include <string.h> #define MAX 1000+10 char mat[MAX][MAX], vis[MAX][MAX]; void dfs(int x, int y) //mat[][]存图像,1代表黑; vis[][]标记是否访问过这个格子 { if (!mat[x][y] || vis[x][y]) { return; } vis[x][y] = 1; //标记此点访问过 dfs(x-1, y-1); dfs(x

黑白图像—————— 八连块

八连块 [题目]:              输入一个n*n的黑白图像(1表示黑色,0表示白色),任务是统计其中八连块的个数.如果两个黑格子有        公共边或者公共顶点,就说它们属于同一个八连块.如下图6-11表示3个八连块. [分析]             通过题目要求,定义8方向数组,运用搜索来确定有几个八连块,搜索查找,     查找过的进行标记,保证不会重复查找到原来的黑格子,另外还要考虑边界问           题,但是下面我的方法就不用考虑边界问题,认真看下面就知道方法了

小白书 黑白图像【DFS/Flood Fill】

http://blog.csdn.net/u010470972/article/details/33415617 Description 输入一个n×n的黑白图像(1表示黑色,0表示白色),任务是统计其中八连块的个数.如果两个黑格子有公共边或者公共顶点,就说它们属于同一个八连块.如下图所示的图形有3个八连块. Input 第1行输入一个正整数n(n≤700),此后输入n行,每行是由n个0或1组成的字符串. Output 在输入黑白图像中,八连块的个数 Sample Input 6 100100 

Visio中如何绘制黑白图像

Camera图像处理原理及实例分析-重要图像概念

Camera图像处理原理及实例分析 作者:刘旭晖  [email protected]  转载请注明出处 BLOG:http://blog.csdn.net/colorant/ 主页:http://rgbbones.googlepages.com/ 做为拍照手机的核心模块之一,camera sensor 效果的调整,涉及到众多的参数,如果对基本的光学原理及 sensor 软/硬件对图像处理的原理能有深入的理解和把握的话,对我们的工作将会起到事半功倍的效果.否则,缺乏了理论的指导,只能是凭感觉和经

C# (GDI+相关) 图像处理(各种旋转、改变大小、柔化、锐化、雾化、底片、浮雕、黑白、滤镜效果)

原文:C# (GDI+相关) 图像处理(各种旋转.改变大小.柔化.锐化.雾化.底片.浮雕.黑白.滤镜效果) C#图像处理   (各种旋转.改变大小.柔化.锐化.雾化.底片.浮雕.黑白.滤镜效果)     一.各种旋转.改变大小   注意:先要添加画图相关的using引用.   //向右旋转图像90°代码如下: private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) {   Graphics g