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

八连块

【题目】:

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

【分析】

            通过题目要求,定义8方向数组,运用搜索来确定有几个八连块,搜索查找,     查找过的进行标记,保证不会重复查找到原来的黑格子,另外还要考虑边界问           题,但是下面我的方法就不用考虑边界问题,认真看下面就知道方法了

【代码】

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int mat[10][10],vis[10][10];
void dfs(int x,int y)
{
    if(!mat[x][y]||vis[x][y])   // 判断是否访问过,或当前格子是白色
        return ;
    //  将图像移到中间,使其被一圈白格子圈住,就可以不用考虑是否越界
    // 不用判断是否越界,因为上面的语句包括了判断是否越界
    vis[x][y]=1;        // 标记已访问过
    // 8个方向的遍历
    dfs(x-1,y-1);dfs(x-1,y);dfs(x-1,y+1);
    dfs(x,y-1);dfs(x,y+1);
    dfs(x+1,y-1);dfs(x+1,y);dfs(x+1,y+1);
}
int main()
{
    int n;
    scanf("%d",&n);
    char s[15]={0};
    memset(mat,0,sizeof(mat));
    memset(vis,0,sizeof(vis));
    int i,j;
    for(i=0;i<n;i++)
    {
        scanf("%s",s);
        for(j=0;j<n;j++)
            mat[i+1][j+1]=s[j]-'0';    //把图像往中间移动一格,空出一圈白格子
    }
    int count=0;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
        if(!vis[i][j]&&mat[i][j])   // 如果是黑格子并且没访问过
        {
            count++;
            dfs(i,j);

        }
     printf("%d\n",count);
}

对本题有什么好的想法,记得留言呕。

时间: 2024-11-10 07:43:20

黑白图像—————— 八连块的相关文章

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

黑白图像

#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

黑白图像问题

1.题目描述:                                                                       黑白图像 Time Limit(Common/Java):1000MS/3000MS          Memory Limit:65536KByteTotal Submit:282            Accepted:82 Description 输入一个n×n的黑白图像(1表示黑色,0表示白色),任务是统计其中八连块的个数.如果两个黑

小白书 黑白图像【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 

CNUOJ 0079 20612统计八连块

20612统计八连块 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 输入一个m行n列的字符矩阵,统计字符“@”组成多少个八连块.如果两个字符“@”所在的格子相邻(横竖或者对角线方向),就说它们属于同一个八连块.例如,下图中有两个八连块.                         输入 第一行包括两个正整数m和n,由空格隔开,接下来的m行,每行n个字符,字符只包括“*”和“@”. 输出 一个自然数,表示八连块的个数.

20612统计八连块

50237242海岛帝国:神圣之日 [试题描述] 输入一个m行n列的字符矩阵,统计字符“@”组成多少个八连块.如果两个字符“@”所在的格子相邻(横竖或者对角线方向),就说它们属于同一个八连块.例如,下图中有两个八连块. [输入要求] 第一行包括两个正整数m和n,由空格隔开,接下来的m行,每行n个字符,字符只包括“*”和“@”. [输出要求] 一个数,表示八连块的个数 [输入实例] 5 5 ****@ *@@*@ *@**@ @@@*@ @@**@ [输出实例] 2 [其他说明] 数据范围:0<m

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. 很是诡异有么有,究竟是眼睛欺骗了我们,还是数字

紫书p199 八连块(BFS,hash)

八连块问题  紫书上的简单搜索  渣渣好久才弄懂 #include<cstdio> #include<cstring> using namespace std; const int M = 1000003; int x[4] = { -1, 1, 0, 0}, y[4] = {0, 0, -1, 1}; int dis[M], h[M], s[M][9], e[9]; int aton(int a[]) { int t = 0; for(int i = 0; i < 9; +