神犇营-my1085-面积

【小韦同学@神犇营-my1085-面积】

题目:

描述

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

输入

输入 10×10 的图形,为了方便,用 “1” 表示 “*”。

输出

输出面积。

输入样例1

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

输出样例1

15

题解:

/*********************************************************************

* 题目:神犇营-my1085-面积 
* 作者:小韦老师
* 邮箱:weichangying_wcy@163.com

* 题解:
	思路:
	破题:什么样的点是没有被围住的点,是从这个点出发,有一条全为0的路
	径可以连通外界(碰到边界)。加边的目的是为了更方便判断哪些点跟外界
	相连。 
	题目为10*10的矩阵,在矩阵的四周加上-1,变成12*12的矩阵(四周都是-1,
	第1行都是-1,最后1行都是-1,第1列都是-1,最后1列都是-1)。 
	枚举原10*10的矩阵的每个点,若满足以下两个条件:
	① 是0
	② 上下左右四个点至少有一个点是-1
	将该点的值改为-1,并且将这个点能连到的所有0(即该点的连通块)都改
	成-1。 
	当按照次规则遍历完原10*10的矩阵后,枚举原10*10的矩阵,数0的个数,
	即为题目所求。 
	
*********************************************************************/

#include <bits/stdc++.h>

using namespace std;

const int N = 20;
int matrix[N][N];
int dir[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
struct node {
	int x, y;
	node(int xx, int yy) {
		x = xx;
		y = yy;
	}
};

bool in(int x, int y) {
	return 0 <= x && x <= 11 && 0 <= y && y <= 11;
}

bool check(int x, int y) {
	for (int i = 0; i < 4; i++) {
		int tx = x + dir[i][0];
		int ty = y + dir[i][1];
		if (in(tx, ty) && matrix[tx][ty] == -1) 
			return true;
	}
	return false;
}

void bfs(int x, int y) {
	queue<node> q;
	q.push(node(x, y));
	matrix[x][y] = -1;
	while (!q.empty()) {
		node now = q.front();
		q.pop();
		for (int i = 0; i < 4; i++) {
			int tx = now.x + dir[i][0];
			int ty = now.y + dir[i][1];
			if (in(tx, ty) && matrix[tx][ty] == 0) {
				matrix[tx][ty] = -1;
				q.push(node(tx, ty));
			}
		}
	}
}

int main() {
	
	memset(matrix, -1, sizeof(matrix));
	for (int i = 1; i <= 10; i++) {
		for (int j = 1; j <= 10; j++) {
			cin >> matrix[i][j];
		}
	}
	for (int i = 1; i <= 10; i++) {
		for (int j = 1; j <= 10; j++) {
			if (check(i, j) && matrix[i][j] == 0) {
				bfs(i, j);
			}
		}
	}
	int cnt = 0;
	for (int i = 1; i <= 10; i++) {
		for (int j = 1; j <= 10; j++) {
			if (matrix[i][j] == 0) {
				cnt++;
			}
		}
	}
	cout << cnt;
	
	return 0;
}

我是小韦同学,企者不立,跨者不行,每天进步一点点。
欢迎大家多多交流,如果发现有错误,请多指正。有疑问的同学也可以留言评论或者发邮件。
邮箱:weichangying_wcy@163.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值