题目网址:信息学奥赛一本通(C++版)在线评测系统
题目介绍:
1359:围成面积
时间限制: 1000 ms 内存限制: 65536 KB
提交数:15209 通过数: 7603
【题目描述】
编程计算由“*”号围成的下列图形的面积。面积计算方法是统计*号所围成的闭合曲线中水平线和垂直线交点的数目。如下图所示,在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
样例代码:
#include <bits/stdc++.h>
using namespace std;
int a[15][15];
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};
int vis[15][15];
int ans = 0;
void dfs(int x, int y) {
//四个方向去走
for (int i = 0; i < 4; ++i) {
int xx = x + dx[i];
int yy = y + dy[i];
if (xx >= 1 && yy >= 0 && xx <= 11 && yy <= 11 && a[xx][yy] == 0) {
vis[xx][yy] = 1;
//这个点搜索,下次就不用再回溯去再搜
a[xx][yy] = 1;
dfs(xx, yy);
}
}
}
int main() {
//给他加上一圈,不然你都不知道入口在哪,因为他可能起点就是1,不让走,不能直接0,0搜
for (int i = 0; i <= 11; ++i) {
a[0][i] = 0;
a[i][0] = 0;
a[11][i] = 0;
a[i][11] = 0;
}
for (int i = 1; i <= 10; ++i) {
for (int j = 1; j <= 10; ++j) {
cin >> a[i][j];
if (a[i][j] == 1)
vis[i][j] = 1;
}
}
dfs(0, 0);
for (int i = 1; i <= 10; ++i) {
for (int j = 1; j <= 10; ++j) {
if (vis[i][j] == 0)
ans++;
}
}
cout << ans;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int a[15][15];
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};
int vis[15][15];
int ans = 0;
void dfs(int x, int y) {
//四个方向去走
for (int i = 0; i < 4; ++i) {
int xx = x + dx[i];
int yy = y + dy[i];
if (xx >= 1 && yy >= 0 && xx <= 11 && yy <= 11 && a[xx][yy] == 0) {
vis[xx][yy] = 1;
//这个点搜索,下次就不用再回溯去再搜
a[xx][yy] = 1;
dfs(xx, yy);
}
}
}
int main() {
//给他加上一圈,不然你都不知道入口在哪,因为他可能起点就是1,不让走,不能直接0,0搜
for (int i = 0; i <= 11; ++i) {
a[0][i] = 0;
a[i][0] = 0;
a[11][i] = 0;
a[i][11] = 0;
}
for (int i = 1; i <= 10; ++i) {
for (int j = 1; j <= 10; ++j) {
cin >> a[i][j];
if (a[i][j] == 1)
vis[i][j] = 1;
}
}
dfs(0, 0);
for (int i = 1; i <= 10; ++i) {
for (int j = 1; j <= 10; ++j) {
if (vis[i][j] == 0)
ans++;
}
}
cout << ans;
return 0;
}