NOJ1102黑白图像——深度搜索DFS

74 篇文章 0 订阅

黑白图像

时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte
总提交:750            测试通过:208

描述

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

输入

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

输出

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

样例输入

6
100100
001010
000000
110000
111000
010100

样例输出

3

题目来源

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


分析:给出的例子中,左上角的1为一个“八连块”,右上角三个1 有公共顶点,也是一个“八连块”,左下角所有的1也组成一个“八连块”,所以一共有3个“八连块”。

解法:利用DFS,遍历每个点,并递归遍历它的四周的点,将访问过的点vis置为true。

注意:这里输入的时候没有空格,所以要用字符串输入。

//黑白图像——DFS
#include<stdio.h>
#include<string.h>

int a[700][700];
int n;
bool vis[700][700];

void dfs(int i, int j)
{
	if(a[i][j] == 0 || vis[i][j]) return;
	vis[i][j] = true;
	dfs(i-1, j-1), dfs(i-1, j), dfs(i-1, j+1);
	dfs(i, j-1),                dfs(i, j+1);
	dfs(i+1, j-1), dfs(i+1, j), dfs(i+1, j+1);
}

int main()
{
	char input[700];
	int ans = 0;
	memset(a, 0, sizeof(a));
	memset(vis, false, sizeof(vis));
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		scanf("%s",input);
		for(int j=0;j<n;j++)
		{
			a[i][j] = input[j] - '0';
		}
	}
	/*
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			scanf("%d",&tmp);
			a[i][j] = tmp;
		}
	}
	*/
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			if(a[i][j] && !vis[i][j]) // 1 && 没访问过
			{
				ans++;
				dfs(i, j);
			}
		}
	}
	printf("%d\n",ans);

	return 0;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值