3533: 黑白图像



描述

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

输入

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

输出

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

样例输入

6
100100
001010
000000
110000
111000
010100

样例输出

3

题目来源

http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=3533


刚开始对我八连通理解错了,怎么都不能数出3个八连通,后来才理解八连通是说八个方向连通就当一个,只有一个单独的也算一个八连通,所以题目给的数据中有3个八连通.

其实这道题最好做的方法深搜,可是提交后却Runtime Error(STACK_OVERFLOW),让我很是郁闷,希望有朋友能帮我解决,谢谢.

不过我用广搜成功A掉了,现在贴出我的代码,分享给大家.



//dfs,测试没问题,不过就是无法通过,Runtime Error(STACK_OVERFLOW),让我很是郁闷,希望有朋友能帮助解决
#include <iostream>
using namespace std;
const int MAX_SIZE = 701;
char maze[MAX_SIZE][MAX_SIZE];
int N;
void dfs(int x , int y)
{
    maze[x][y] = '0';
    for(int i = -1 ;  i <= 1 ; i++)
    {
        for(int j = -1 ; j <= 1 ; j++)
        {
            int gx = x + i;
            int gy = y + j;
            if(gx>=0 && gx<N && gy>=0 && gy<N && maze[gx][gy]=='1')
                dfs(gx,gy);
        }
    }
}
int main()
{
    cin>>N;
    int ans = 0;
    for(int i = 0 ; i < N ; i++)
        cin>>maze[i];
    for(int i = 0 ; i < N; i++)
    {
        for(int j = 0 ; j < N ; j++)
        {
            if(maze[i][j]=='1')
            {
                dfs(i,j);
                ans++;
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}

//bfs成功通过
#include <iostream>
#include <queue>
using namespace std;
const int MAX_SIZE = 701;
char maze[MAX_SIZE][MAX_SIZE];
int N;
void bfs(int x,int y)
{
    maze[x][y] = '0';
    queue<pair<int,int> > q;
    pair<int,int> p;
    q.push(make_pair(x,y));
    while(!q.empty())
    {
        p = q.front();
        q.pop();
        for(int i = -1 ; i <= 1 ; i++)
        {
            for(int j = -1 ; j <= 1 ; j++)
            {
                int nx = p.first + i;
                int ny = p.second + j;
                if(maze[nx][ny]=='1')
                {
                    maze[nx][ny]='0';
                    q.push(make_pair(nx,ny));
                }
            }
        }
    }
}
int main()
{
    cin>>N;
    int ans = 0;
    for(int i = 0 ; i < N ; i++)
        cin>>maze[i];
    for(int i = 0 ; i < N; i++)
    {
        for(int j = 0 ; j < N ; j++)
        {
            if(maze[i][j]=='1')
            {
                bfs(i,j);
                ans++;
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值