【小韦同学@神犇营-my1085-面积】
题目:
描述
编程计算由 “” 号围成的下列图形的面积。面积计算方法是统计 * 号所围成的闭合曲线中水平线和垂直线交点的数目。如下图所示,在 10×10 矩阵中,有 “” 围住了 15 个点,因此面积为 15。
输入
输入 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