白书T1359围成面积

白书(即一本通)deT1359围成面积

【题目描述】
编程计算由“”号围成的下列图形的面积。面积计算方法是统计号所围成的闭合曲线中水平线和垂直线交点的数目。如下图所示,在10×10的二维数组中,有“*”围住了15个点,因此面积为15。

在这里插入图片描述

【输入】
10×10的图形。

【输出】
输出面积。

【输入样例】
0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 1 1 0 0 0
0 0 0 0 1 0 0 1 0 0
0 0 0 0 0 1 0 0 1 0
0 0 1 0 0 0 1 0 1 0
0 1 0 1 0 1 0 0 1 0
0 1 0 0 1 1 0 1 1 0
0 0 1 0 0 0 0 1 0 0
0 0 0 1 1 1 1 1 0 0
0 0 0 0 0 0 0 0 0 0
【输出样例】
15

最近刷白书做了这道题,几番baidu感觉大佬们的代码高(冗)妙(长),于是我直接放弃了观摩,潜心思索,发现可以用深搜解决这道题(虽然是在“队列”这一块里面,但我依旧随心随性)

** 题目中要说,10*10矩阵中被“1”所包围的点的总数是面积。反过来,不被“1”包围的点,也就是四连通(往四个方向走)能走到边界的点,我们说它未被包围,于是面积=100(总)- 未包围的点总数 - “1”的总数。所以我们从边界出发,把所有能走到的点都算出来,用a来储存,就能求出面积了。**

由于这是博主第一篇博客(暗笑),よろしくお願いします(请多加包涵);

源代码

#include <cstdio>
using namespace std;
int dx[4] = { 0, 0, 1, -1}, dy[4] = { 1, -1, 0, 0};// 四连通
int h[15][15], a[15][15];  //h表示是否可以走(即0和1),a表示是否走过,走过为1
int ans;
void dfs(int x, int y){   //深搜
	a[x][y] = 1;
	for(int i = 0; i < 4; i++){
	 int nx = x + dx[i], ny = y + dy[i];
		if(nx >= 1 && ny >= 1 && nx <= 10 && ny <= 10 && !a[nx][ny] && !h[nx][ny]){  //边界以内
			a[nx][ny] = 1;  //此位置已走过
			dfs(nx,ny);
		}
	}
}
int main(){
	for(int i = 1; i <= 10 ;i++)  //读入
	for(int j = 1 ; j <= 10; j++)
	scanf("%d", &h[i][j]);
	for(int i = 1 ;i <= 10; i++){  //从边界出发往里走
	if(!h[i][1] && !a[i][1] ) 
	dfs(i,1);
	if(!h[i][10] && !a[i][10])
	dfs(i,10);
	if(!h[1][i] && !a[1][i])
	dfs(1,i);
	if(!h[10][i] && !a[10][i])
	dfs(10,i);
	}
	for(int i = 1; i <= 10; i++){
		for(int j = 1; j <= 10; j++)
		if(a[i][j] == 1) ans++;  //走过的一定是没有被包围的
		else if(h[i][j]) ans++;  //是“1”的点
	}
	printf("%d", 100-ans);
	return 0; 
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值